我正在解析XML文件,我有几种方法类似于:
public static Integer getInteger(Object integer) {
if (integer == null) {
return 0;
}
try {
return Integer.parseInt(integer.toString(), 10);
} catch (Exception ex) {
return 0;
}
}
所以基本上,你传递一个对象,假设将它转换为整数(我也有Float的版本等)。
这似乎运作良好,但作为Java新手,我想知道如何改进它。我在装箱/拆箱方面特别有趣(至少从C#开发者的角度来看)。
由于
修改
抱歉,我不清楚该方法的内容。是的,它现在是一个XML文件所以它总是一个字符串。但字符串可能是空的,甚至可能为空。我想如果出现任何错误,我想总是返回0.
答案 0 :(得分:5)
通常不应该抓住Exception
。在这里捕捉NumberFormatException
会更合适。
转换为Integer
而不是int
的任何理由?为什么不让调用者执行装箱转换如果他们需要它?
答案 1 :(得分:2)
你应该使用instanceof运算符,然后进行安全转换(所以如果Object整数是instanceof Integer,则抛出它)。
然后你不必捕获异常(在这种情况下是未经检查的NumberFormatException)
public static Integer getInteger(Object integer) {
if (integer == null) {
return 0;
}
if (integer instanceof Integer) {
return (Integer)integer;
}
return 0;
}
修改强>
如果数据来自XML,那么它当然永远不会是Integer :)然后仍然需要从String解析,所以请看其他答案。
答案 2 :(得分:2)
您没有说明integer
是否是Integer
的实例。如果它是你可以投下它:
Integer i = (Integer) integer;
首先检查了null
和instanceof
。
如果它不是Integer的实例,那么你所做的事情似乎是合理的,尽管你只需要抓住NumberFormatException
。
答案 3 :(得分:1)
正如Jon暗示的那样,返回int
(原始数据类型)而不是Integer
(包装类)可能会更好(假设您永远不想返回null
)。< / p>
此外,当输入通常是Integer
对象或其他Number
子类(我正在调用输入input
时,添加此代码可能是一种快捷方式,因为它太混乱了):
if (input instanceof Number) {
return ((Number) integer).intValue();
}
答案 4 :(得分:0)
如果您想要发信号,那么返回Integer
是有意义的。您已经对此进行了测试,但您不应该返回0
,除非您有一个非常明确且有些特殊的要求。 无价值不等于0
。
答案 5 :(得分:0)
此外,除了null
之外,您还可以添加更多特殊情况,例如检查空字符串:
public static Integer getInteger(Object integer) {
if (integer == null) {
return 0;
}
try {
String s = integer.toString();
if (s.isEmpty())
return 0;
return Integer.parseInt(s, 10);
} catch (Exception ex) {
return 0;
}
}
另一方面,您可以剪切所有特殊情况,并仅使用:
public static Integer getInteger(Object integer) {
try {
return Integer.parseInt(integer.toString(), 10);
} catch (Exception ex) {
return 0;
}
}
最后,性能增益(或损失)取决于输入数据的哪个部分是null
,空的,不可解析的整数或“正常”整数字符串。