-2

在重构一些代码时,我被要求对异常处理进行更改,更改一些 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。

所以问题是:通过简单的整数比较和归因,可以捕获块中所有异常的最具体的异常是什么?

4

3 回答 3

3

NumberFormatException 仅在您尝试将 String 解析为 Integer 时发生

在这段代码中,唯一的风险是有一个Integer并不真正代表一个月(13,14,15)或一天(32,33,34...)

在这种情况下,您可以例如抛出一个IllegalArgumentException

于 2013-05-27T17:25:20.277 回答
2

为什么我们要捕获运行时异常?我知道这是一个值得讨论的问题,但是,必须这样做对我意味着不正确的处理。一个简单的健全性检查可以让你一次捕获所有运行时异常:/

于 2013-05-27T17:29:49.507 回答
1

尽管对于这个代码片段来说,捕获RuntimeException和重新抛出自定义异常看起来很奇怪,但这是这个极其丑陋的代码的不太重要的问题。(对不起:没有什么私人的,只有商业)。

  • RuntimeException 不能在这里抛出,所以完全删除 try/catch 块。
  • 重命名变量。我java所有变量都应该以小写字母开头。
  • 简化您的代码。两个分支或if看起来完全一样。仅在索引上的差异。
  • 不要将原始包装器与==. 这有时会起作用,因为Integer类具有低值的内部缓存(我认为从 0 到 256 或 512 ......)

等等等等

于 2013-05-27T17:36:12.400 回答