异常
异常就是程序运行时发生的不正常情况,如打开一个不存在的文件,与错误不同(代码错误),异常一般分为两大类:
- Error:由于java虚拟机的限制而产生的程序错误,一般无法解决。如:JVM系统内部错误、资源耗尽等严重情况。
- Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理
Error和Exception包含如下:
异常处理
- Java采用抓抛模型catch-throw异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,易于维护。
- 异常对象的生成两种方式
1.由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出
2.由开发人员手动创建:创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样 - 捕获异常
当一个方法抛出异常时,如果没有实现异常处理,会一直向上寻找异常解决方法,如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。 - 选择处理异常
如果这些异常是运行时异常,则方法的调用者有3种选择:
(1)不理会这些声明,编译可以通过;
(2)使用try…catch处理异常;
(3)使用throws继续延迟处理
如果是非运行时异常,方法调用者有两种选择:
(1)使用try…catch处理异常;
(2)使用throws继续延迟处理,让编译先通过。
try——catch捕获异常
- try-catch语句
在try语句块中,放置可能出现异常的代码。在catch语句块中是对异常对象进行处理的代码。当try中的保护代码块发生异常时,如果catch块中声明了该异常,异常将会被传递到catch块中。 - 每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
- 如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数,但是参数不能是与已知异常无关的异常类,否则将不会执行
- try-catch-finally语句
try-catch-finally语句就是在try-catch语句的基础上,加上finally代码块,finally代码块是无论是否发生异常都会被执行
throw和throws
当程序没有使用try-catch语句捕获异常时,就需要用到throw和throws关键字
- throws关键字
throws关键字(必须在定义方法的时候使用),用于声明该方法可能会抛出的异常类型,一般用于不知道该怎么处理异常时,放任其不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。
使用throws关键字明确指出了该方法可能抛出的异常。throws后面如果声明多个异常类型,之间可用“,”分隔 - throw关键字
当创建一个异常对象之后,可以使用throw关键字抛出异常对象。throw必须在方法体中使用。
手动抛出异常但是有时候有些错误在jvm看来不是错误,所以我们需要自己手动引发异常,这就是throw的作用,例如:
public void setAge(int age) throws Exception {
if(age<0){
Exception e = new ArithmeticException(“年龄不能为负”);
throw e;
}
this.age = age;
}
- 注意重写方法不能抛出比被重写方法范围更大的异常类型:
public class A {
public void methodA() throws IOException {
……
} }
public class B1 extends A {
public void methodA() throws FileNotFoundException {
……
} }
public class B2 extends A {
public void methodA() throws Exception { //报错,抛出的异常类型比父类异常类型大
……
} }
人工抛出异常
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出。
- 人工抛出异常,首先要生成异常类对象,然后通过throw语句实现抛出操作,注意,可抛出的异常必须是Throwable或其子类的实例。
- 自定义异常类
自定义异常类是包括人工抛出异常的自定义类:
1.一般地,用户自定义异常类都是RuntimeException的子类。
2.自定义异常类通常需要编写几个重载的构造器。
3.自定义的异常类对象通过throw抛出。
4.自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。
5.用户自己的异常类必须继承现有的异常类