运行时异常和普通异常的区别

来源:互联网 发布:mac分屏 编辑:程序博客网 时间:2024/06/07 14:37

运行时异常和普通异常的区别:

Java中提供了两种错误的异常类,分别为ErrorException,且它们拥有共同的父类—Throwable

Error表示程序运行期间出现了非常严重的错误,并且该错误不可恢复,由于这属于JVN层次的严重错误,因此这种错误是会导致程序终止执行的。此外,编译器不会检查Error是否被处理,因此在程序中不推荐去捕获Error类型的异常,主要的原因是运行时异常多是由逻辑错误导致的,属于应该解决的错误,也就是说一个正确的程序的程序是不应该存在Error的。当这些异常发生时,JVM一般会选择将线程终止。

Exception表示可恢复异常,是编译器可以捕获到的。它包含两种类型,检查异常和运行时异常;

检查异常

检查异常是程序中最经常碰到的异常,所以继承自Exception并且不是运行是异常的都是检查异常。,比如常见的IO异常和SQL异常,这种异常发生在编译阶段,java编译器强制程序去捕获此类型的异常,即把可能会出现这些异常的代码放在try块中,把对异常处理的代码放在catch块中,这种异常一般在如下几种情况中使用:

异常并不会导致程序出错,进行处理后可以继续执行后续的操作,例如,当连接数据库失败后,可以重新连接后进行后续操作。

程序依赖不可靠的外部条件,例如系统的IO

运行时异常

运行时异常不同于编译时异常,编译器没有对其进行强制的捕获并处理。如果不对这种异常进行处理,当这种异常出现时,会有JVM来处理,例如NullPointerException异常,它是运行时异常,常见的运行时异常包括:ClassCastException(类型转换异常),ArrayIndexOutOfBoundsException(数组越界异常),ArrayStoreException(数组存储异常),BufferOverflowException(缓冲区溢出异常),ArithmeticException(算术异常)等。

出现运行时异常后,系统会把异常一直往上层抛出,直到遇到处理的代码为止,若没有遇到处理块,则抛到最上层;如果是多线程就用Thread.run()方法抛出,如果是单线程,就用main()方法抛出;抛出之后,如果是线程,那么这个线程也就退出了。如果是主线程抛出的异常,那么整的程序也就退出了,所以不对运行时异常进行处理,后果非常严重,一旦发生,要么是线程终止,要不是主程序终止;

在使用异常处理时:还需要注意以下几个问题:

Java异常处理时,还用的多态的机制,如果在异常处理的过程中,如果先捕获父类的异常,然后在捕获子类的异常,那么捕获子类的代码将永远不会被执行。因此,在捕获时,正确的写法是:先捕获子类在捕获父类的异常信息。

可以根据实际的需求自定义异常,这些异常只需要继承Exception类即可。

原创粉丝点击