java异常指在程序运行时出现的一些错误,中断了正在执行的程序的正常流程,也就是说只要发生异常,程序都会被打断。常见的异常例如IO异常(文件找不到FileNotFoundException、网络连接失败)、空指针异常、数组越界、NoClassDefFoundError
等。Java通过API中Throwable类的众多子类描述各种不同的异常,因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误信息。
Java所有异常类都是 Throwable的子类,它包括了Java异常处理的两个重要子类:Error和Exception.
Note:简单来说,异常与错误的区别是:异常可以通过程序自身捕捉处理,而错误是程序自身无法处理的。
Error:Error及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,是程序无法处理的错误,这类错误比较严重, 这些错误是不可查的(对应Exception的可查),就是说用户程序无法catch这类错误,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。例如JVM运行错误(Virtual MachineError),当 JVM 内存资源不足时出现 的OutOfMemoryError, StackOverFlowError,类加载失败NoClassDefFoundError
。这些异常发生时,JVM一般会选择线程终止。
Exception:可以通过捕捉处理使程序继续执行,是程序自身可以处理的异常,也称为非致命性异常类。根据错误发生原因可分为:
- RuntimeException异常,可以捕获并处理,但是通常这类异常我们不会去捕获,编译器也不会去检查。编译器对RuntimeException及其子类不做强制捕获要求,不是指应用程序本身不应该捕获并处理RuntimeException,是否需要捕获,具体问题具体分析。
- 除RunTimeException之外的异常(例如IOException异常),这类异常必须捕获,如果不捕获,编译不通过,Eclipse等也会强制开发人员进行捕获。
RuntimeException及其子类异常,通常是程序逻辑编写不对造成的,应该修复程序本身。例如:
- NullPointerException:对某个null的对象调用方法或字段
- IndexOutOfBoundsException:数组索引越界
- ArithmeticException:除数为0
除RunTimeException之外的异常(例如IO异常),是应用程序逻辑处理的一部分,应该捕获并处理。例如:
- NumberFormatException:数值类型的格式错误
- FileNotFoundException:未找到文件
- SocketException:读取网络失败