Java中的error和exception
标签(空格分隔): 面试
Throwable
在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。
Throwable 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error 错误
Error表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时Java虚拟机出现的问题。表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
例如,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。
Error的子类有:AWTError、IOError、LinkageError、ThreadDeath
Exception 异常
Exception是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。
Java 提供了两类主要的异常 :runtime exception 和 checked exception 。
运行时异常 Runtime exception
RuntimeException,也称作运行时异常。RuntimeException 类及其子类表示JVM常用操作引发的错误。,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常NullPointerException、ArithmeticException和 ArrayIndexOutOfBoundException。
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()
抛出,如果是单线程就被main()
抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是可以被 catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。
异常处理的目标之一就是为了把程序从异常中恢复出来 。
非运行时异常 checked
checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。
对于非运行时异常(checked exception),必须要对其进行处理,否则无法通过编译。
处理方式有两种:
1.使用try..catch..finally进行捕获;
2.在产生异常的方法声明后面写上throws 某一个Exception类型,如throws Exception,将异常抛出到外面一层去。
错误和异常的区别(Error vs Exception)
java.lang.Error
:
Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。
java.lang.Exception
:
Throwable的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。Error
和RuntimeException
及其子类都是未检查的异常(unchecked exceptions),而所有其他的Exception类都是检查了的异常(checked exceptions).