-
java异常架构图
-
Throwable
Throwable是java语言中所有错误或异常的超类
Throwable包含两个子类 : Error 和 Exception 他们通常用于指示发生了异常情况
Throwable包含了其线程创建时线程执行堆栈的快照, 它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息
-
RuntimeException
RuntimeException是那些可能再java虚拟机正常运行期间抛出异常的超类
编译器不会检查RuntimeException异常. 例如, 除数为0时, 抛出ArithmeticException异常. RuntimeException是ArithmeticException的超类. 当发生代码除数为0的情况时, 倘若既没有通过throws声明抛出ArithmeticExceptio异常, 也没有通过try..catch..处理该异常, 也能通过编译. 这就是我们所说的"编译器不会检查RuntimeException异常".
所以应尽量避免代码出现该情况发生.
-
Error
Error是Throwable的子类, 用于指示合理的应用程序不应该试图捕获的严重问题, 大多数这样的错误都是异常条件.
和RuntimeException一样, 编译器也不会检查Error
* Exception下又分为两个分支, RuntimeException和IOException
* 由于程序错误导致的异常属于RuntimeException;
* 而程序本身没问题, 但是由于像I/O错误这类问题导致的异常属于IOException
-
重点来说说RuntimeException
先来看一段代码
public class Demo{
public static void main(String[] args){
String str = "100";
int sum = Integer.parseInt(str);
System.out.println(num * 2);
}
}
parseInt的源码定义是: public static int parseInt(String s) throws NumberFormatException
这个方法上已经明确抛出异常, 但是在进行调用时发现, 即使没有进行异常处理也可以正常执行, 这个就属于RuntimeException的范畴
很多代码都可能出现异常, 例如"10/0"都可能产生异常, 如果所有可能产生异常的地方都强制性异常处理, 代码就会太过复杂, 所以在异常设计的时候, 考虑到一些异常可能是简单问题, 所以将这类异常称作RuntimeException, 也就是使用RuntimeException定义的异常类可以不需要强制性进行异常处理
- 常见问题 : 请解释Exception和RuntimeException的区别, 请举例几个常见的RuntimeException
- 使用Exception是RuntimeException的父类, 使用Exception定义的异常都要求必须使用异常处理, 而使用RuntimeException定义的异常可以由用户选择性的来进行异常处理
- 常见的RuntimeException : ClassCastException, NullPointerException等