Bad*_*rse 84 java encapsulation exception-handling
我有一个项目,我们经常使用它将Integer.parseInt()String转换为int.当出现问题时(例如,String不是数字而是字母a或其他),此方法将引发异常.但是,如果我必须在我的代码中处理各种异常,那么这很快就会变得非常难看.我想把它放在一个方法中,但是,我不知道如何返回一个干净的值,以表明转换出错了.
在C++中,我可以创建一个接受指向int的指针的方法,让方法本身返回true或false.但是,据我所知,这在Java中是不可能的.我还可以创建一个包含true/false变量和转换值的对象,但这似乎也不理想.对于全局值也是如此,这可能会给我带来一些多线程的麻烦.
那么有一个干净的方法吗?
Jon*_*eet 133
你可以返回一个Integer而不是一个int,返回null解析失败.
遗憾的是,如果没有内部抛出的异常,Java没有提供这样做的方法 - 您可以隐藏异常(通过捕获并返回null),但如果您解析数百个,它仍然可能是性能问题数千位用户提供的数据.
编辑:这种方法的代码:
public static Integer tryParse(String text) {
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果text为null ,我不确定这会做什么.您应该考虑 - 如果它代表一个错误(即您的代码可能传递无效值,但永远不应传递null),那么抛出异常是合适的; 如果它不代表一个bug,那么你应该像对任何其他无效值一样返回null.
最初这个答案使用了new Integer(String)构造函数; 它现在使用Integer.parseInt和拳击操作; 以这种方式,小值将最终被装箱到缓存Integer对象,使其在这些情况下更有效.
Joa*_*uer 34
当它不是数字时,你期望什么行为?
例如,如果您在输入不是数字时经常使用默认值,那么这样的方法可能很有用:
public static int parseWithDefault(String number, int defaultVal) {
try {
return Integer.parseInt(number);
} catch (NumberFormatException e) {
return defaultVal;
}
}
Run Code Online (Sandbox Code Playgroud)
当无法解析输入时,可以为不同的默认行为编写类似的方法.
Bry*_*ner 26
在某些情况下,您应该将解析错误作为快速失败的情况处理,但在其他情况下,例如应用程序配置,我更喜欢使用Apache Commons Lang 3 NumberUtils处理缺省值的输入.
int port = NumberUtils.toInt(properties.getProperty("port"), 8080);
Run Code Online (Sandbox Code Playgroud)
Dad*_*boy 16
为避免处理异常,请使用正则表达式以确保首先包含所有数字:
if(value.matches("\\d+") {
Integer.parseInt(value);
}
Run Code Online (Sandbox Code Playgroud)