异常概念
异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
异常发生在程序运行期间,它影响了正常的程序执行流程。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
我们需要掌握以下三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Java异常是一个描述在代码段中发生异常的对象,当发生异常情况时,一个代表该异常的对象被创建并且在导致该异常的方法中被抛出,而该方法可以选择自己处理异常或者传递该异常。
异常体系结构
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable 作为所有异常的超类。
在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
异常之间的区别与联系
1、Error
Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在Java中,错误通常是使用Error 的子类描述。
2、Exception
在Exception 分支中有一个重要的子类RuntimeException (运行时异常),该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException (数组下标越界)、NullPointerException (空指针异常)、ArithmeticException (算术异常)、MissingResourceException (丢失资源)、ClassNotFoundException (找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
Error 和Exception 的区别: Error 通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程; Exception 通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
3、检查异常和不受检查异常
检查异常:在正确的程序运行过程中,很容易出现的、情理可容的异常状况,在一定程度上这种异常的发生是可以预测的,并且一旦发生该种异常,就必须采取某种方式进行处理。
不受检查异常:包括RuntimeException及其子类和Error。
分析: 不受检查异常为编译器不要求强制处理的异常, 检查异常则是编译器要求必须处置的异常。
Java异常处理机制
java异常处理本质:抛出异常和捕获异常
1、抛出异常
假使我们创建了一个学生对象Student的一个引用stu,在调用的时候可能还没有初始化。所以在使用这个对象引用调用其他方法之前,要先对它进行检查,可以创建一个代表错误信息的对象,并且将它从当前环境中抛出,这样就把错误信息传播到更大的环境中。
if(stu == null){
throw new NullPointerException();
}
2、捕获异常
对于运行时异常、错误和检查异常,Java技术所要求的异常处理方式有所不同由于运行时异常及其子类的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。对于方法运行中可能出现的Error ,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error 异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
3、异常处理五个关键字
分别是: try 、catch 、finally 、throw 、throws
try -- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch -- 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally -- finally语句块总是会被执行。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,
throw -- 用于抛出异常。
throws -- 用在方法签名中,用于声明该方法可能抛出的异常。