NumberFormatException异常为什么不需要捕获?
在写数字字符串转数字的过程(Integer a = Integer.parseInt("123");
)发现此静态方法抛出了NumberFormatException
异常,但实际代码中并没有要求try/catch处理或者继续向上抛出异常,很是诧异,因此查询了资料,现在记录如下。
异常源码信息
此方法的源码为:
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
说明需要抛出的异常类型是:NumberFormatException,其定义类的源码如下:
public class NumberFormatException extends IllegalArgumentException {}
IllegalArgumentException类定义如下:
public class IllegalArgumentException extends RuntimeException {}
类的继承关系
可见NumberFormatException是RuntimeException的子类,根据查询的资料,RuntimeException异常以及抛出的其子类异常是不需要try/catch捕获的异常。也就是说RuntimeException不需要强制try/catch捕获,而非RuntimeException异常则需要进行捕获处理
.
总结如下:
CheckedException:在程序中必须使用try...catch进行处理。
RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。
对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try…catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try…catch的异常处理机制进行处理。
常见RuntimeException异常
-
1、
NullPointerException
:见的最多了,其实很简单,一般都是在null对象上调用方法了。 -
2
NumberFormatException
:继承IllegalArgumentException,字符串转换为数字时出现。比如int i= Integer.parseInt(“ab3”); -
3、
ArrayIndexOutOfBoundsException
:数组越界。比如 int[] a=new int[3]; int b=a[3]; -
4、
StringIndexOutOfBoundsException
:字符串越界。比如 String s=”hello”; char c=s.chatAt(6); -
5、
ClassCastException
:类型转换错误。比如 Object obj=new Object(); String s=(String)obj; -
6、
UnsupportedOperationException
:该操作不被支持。如果我们希望不支持这个方法,可以抛出这个异常。既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。 -
7、
ArithmeticException
:算术错误,典型的就是0作为除数的时候。 -
8、
IllegalArgumentException
:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常
下一篇: 10.Flask