我有一个项目,在这个项目中,我们经常使用Integer.parseInt()
将字符串转换为整数。当出现错误(例如,String
不是数字,而是字母a
等)时,此方法将抛出异常。然而,如果我不得不在我的代码中到处处理异常,这很快就会开始看起来非常丑陋。我想把它放在一个方法中,然而,我不知道如何返回一个干净的值来表明转换出错。
在C++中,我可以创建一个接受int指针的方法,并让方法本身返回true或false。然而,据我所知,这在Java中是不可能的。我也可以创建一个包含true/false变量和转换后的值的对象,但这似乎也不太理想。对于全局值也是如此,这可能会给我在多线程方面带来一些麻烦。
那么有没有一种干净利落的方法呢?
发布于 2009-09-28 09:02:57
您可以返回Integer
而不是int
,在解析失败时返回null
。
遗憾的是,Java没有提供一种在内部不抛出异常的情况下实现这一点的方法-您可以隐藏异常(通过捕获它并返回null),但如果您正在解析数十万位用户提供的数据,这仍然可能是一个性能问题。
EDIT:这样的方法的代码:
public static Integer tryParse(String text) {
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return null;
}
}
请注意,我根本不确定如果text
为null,这将如何处理。你应该考虑这一点--如果它代表一个bug (例如,你的代码可能传递了一个无效值,但永远不应该传递null),那么抛出一个异常是合适的;如果它不代表一个bug,那么你可能应该像返回其他任何无效值一样返回null。
最初,这个答案使用new Integer(String)
构造函数;现在它使用Integer.parseInt
和装箱操作;通过这种方式,小值将最终被装箱到缓存的Integer
对象,使其在这些情况下更有效。
发布于 2009-09-28 11:13:17
当它不是数字时,你期望什么行为?
例如,如果您经常在输入不是数字时使用默认值,那么这样的方法可能会很有用:
public static int parseWithDefault(String number, int defaultVal) {
try {
return Integer.parseInt(number);
} catch (NumberFormatException e) {
return defaultVal;
}
}
当输入不能被解析时,可以为不同的默认行为编写类似的方法。
发布于 2013-09-28 02:44:10
在某些情况下,您应该将解析错误作为快速失败的情况来处理,但在其他情况下,例如应用程序配置,我更喜欢使用Apache Commons Lang 3 NumberUtils来处理缺省的输入。
int port = NumberUtils.toInt(properties.getProperty("port"), 8080);
https://stackoverflow.com/questions/1486077
复制相似问题