Java 整数属性中可能存在哪些异常?
在重构一些代码时,我被要求对异常处理进行更改,更改一些catch子句以获得try块中可能出现的最具体的异常。但后来我发现了这个片段:Java 整数属性中可能存在哪些异常?,java,Java,在重构一些代码时,我被要求对异常处理进行更改,更改一些catch子句以获得try块中可能出现的最具体的异常。但后来我发现了这个片段: try { if (flagYear) { if (Day[0] == Month[0]) { if (Day[1] != null) { Month = Month[0]; Day = Day[1];
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
因此,问题是:哪种最具体的异常可以通过简单的整数比较和属性捕获块中的所有异常?NumberFormatException仅在尝试将字符串解析为整数时发生 在这段代码中,唯一的风险是有一个不代表一个月(13,14,15)或一天(32,33,34…)的
整数
在这种情况下,您可以例如抛出一个IllegalArgumentException
为什么要捕获运行时异常?我知道这是一个需要讨论的问题,但是,对我这样做意味着不正确的处理。一个简单的健全性检查可以避免您在一个catch中吞食所有运行时异常:/尽管捕获运行时异常并重新抛出自定义异常对于此代码片段来说很奇怪,但这是此极其丑陋的代码中不太重要的问题。(对不起,没有私人的事,只有公事)
- 无法在此处引发RuntimeException,因此请删除try/catch块
- 重命名变量。我认为所有变量都应该以小写字母开头李>
- 简化代码。两个分支或
if
看起来完全相同。仅在索引方面存在差异
- 不要将基本包装器与
==
进行比较。这有时会起作用,因为Integer
类具有低值的内部缓存(我认为从0到256或512…)
等等,等等。问题不清楚;但是,这可能会对您有所帮助:ArrayIndexOutOfBoundsException
和NumberFormatException
都是RuntimeException
的子项。但是:这三个异常都是未经检查的异常,通常不会被抛出或捕获。我不明白这个练习的目的。按照惯例,变量名应该以小写字母开头。StackOverflow语法突出显示尤其糟糕,它像类型声明一样对它们着色,使其更难读取。变量应该以驼峰大小写的方式声明。在这种情况下,日和月应分别为小d和小m。同样,如何将整数
(月[0])分配给整数
的数组?你的代码甚至不应该编译,更不用说抛出运行时异常了。IllegalArgumentException
是一个未经检查的异常:除非你完全确定自己在做什么,否则你不应该抛出异常。我同意这一点,但有一个常见的异常规则是,只有当你想用它们做有用的事情时,才捕捉异常。在这种情况下,我看不出他/她能做什么,除了抓捕/记录/重新催促。他/她有可能忽略异常,并让它在发生时传播。