在重构某些代码时,我被要求对异常处理进行更改,更改一些catch子句以在try块中获得最具体的异常。但后来我遇到了这个片段:
try {
if (flagYear) {
if (Day[0] == Month[0]) {
if (Day[1] != null) {
Month = Month[0];
Day = Day[1];
} else {
Month = Month[1];
Day = Day[0];
}
} else {
Month = Month[0];
Day = Day[0];
}
} else {
if (Day[0] == Month[0]) {
if (Month[1] != null) {
Month = Month[1];
Day = Day[0];
} else {
Month = Month[0];
Day = Day[1];
}
} else {
Month = Month[0];
Day = Day[0];
}
}
} catch (RuntimeException e) {
throw new ExampleException();
}
变量声明为:
Integer[] Day = new Integer[2];
Integer[] Month = new Integer[2];
Integer类上的javadoc仅引用NumberFormatException。
所以问题是:什么是能够通过简单的整数比较和归因捕获块中所有异常的最具体的异常?
答案 0 :(得分:3)
只有在尝试将字符串解析为整数
时才会发生NumberFormatException在这段代码中,唯一的风险是Integer
并不真正代表一个月(13,14,15)或一天(32,33,34 ......)
在这种情况下,您可以举例IllegalArgumentException
答案 1 :(得分:2)
为什么我们要捕获运行时异常?我知道这是一个争论的问题,但是,必须对我这样做意味着不正确的处理。一个简单的健全性检查可以节省您在一个catch中吞噬所有运行时异常:/
答案 2 :(得分:1)
虽然捕获RuntimeException
并重新抛出自定义异常对于这段代码片段来说看起来很奇怪,但这是一个不太重要的问题。 (对不起:没有私人,只有生意)。
if
看起来完全相同。只有索引的差异。==
进行比较。这将有时工作只是因为Integer
类具有低值的内部缓存(我认为从0到256或512 ......)等等。