异常情况是指在程序运行时,可能由于外部系统的条件变更(与我们一厢情愿所设想的不一致),而导致程序可能出错的情况.
Throwable类的异常体系:
Throwable类是所有错误和异常的父类
-错误类(Error类):它表示Java程序运行时产生的系统内部错误或资源耗尽的错误,依靠修改程序本身是不能恢复执行. 例如:运行一个不存在的类就会产生错误.
-异常类(Exception):它表示程序本身可以处理的错误,在Exception类的众多子类中有一个特殊的子类--RuntimeException类,该类及其子类用于表示运行时异常,Exception类的其他子类都用于表示编译时异常.
一、编译时异常
在Exception类中,除了RuntimeException类以外,其他的子类都是编译时异常(Java编译器会对编译时异常进行检查,如果出现这类异常就必须对其进行处理,否则程序无法通过编译)
处理编译时异常有两种方式:
1.使用try....catch语句对异常进行捕获处理
2.使用throws关键字申明抛出异常,由调用者对异常进行处理
二、运行时异常
RuntimeException类及其子类都是运行时异常(运行时异常是指在程序运行时由Java虚拟机自动进行捕获处理的,Java编译器不会对异常进行检查,程序能编译通过,只是运行时可能会报错)
常见的运行时异常类型(Exception类的子类):
1.InputMismatchException:输入类型不匹配
2.ArithmeticException : 算数异常
3.NullPointerException:空指针异常
4.ArrayIndexOutofBoundsException:数组下标越界异常
5.ClassCastException:类转换异常
6.NumberFormatException:数字格式化异常
运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复.
三、异常处理及用法
处理异常的五个关键字:
try :放置可能产生的代码块
catch :后面对应异常类型和一个代码块,该代码块用于处理这种类型的异常
finally:主要用于回收在try代码块里打开的物理资源,[finally代码块总是被执行]
throw:用于抛出一个实际的异常。它可以单独作为语句来抛出一个具体的异常对象
throws:用在方法签名中,用于声明该方法可能抛出的异常.
1.try......catch....finally.....语句
Java提供了该语句用于捕获并处理异常,使异常发生后后面的程序代码能正常执行
try(
代码块 //防止可能发生异常的Java语句
)catch(Exception e){
代码块 //写针对异常进行处理的代码
}
当try代码块中的程序发生异常时,系统会将异常的信息封装成一个异常对象,并将这个对象传递给catch代码块进行处理.catch代码块需要一个参数指明它能够接受的异常类型,这个参数必须时Exception类或其子类
注意 :
1.try代码块是必须的
2.catch代码块可以由多个,但捕获父类异常的catch代码块必须位于捕获子类异常的catch代码块后面
3.finally代码块不能单独出现,无论程序是否发生异常finally代码块都会执行.。
4.如果程序发生异常,但是异常没有被捕获,在执行完finally代码块中的代码之后,程序就会中断执行
运行结果:
在catch代码块中增加了一个return语句,用于结束当前方法,这样当catch代码块执行完之后,finally代码块之后的代码就不会执行了,而finally代码块仍会执行,不受return语句的影响。
注意:如果在try....catch语句中执行了System.exit(( ))语句,那么finally代码块不会再执行。Sysrem.exit( ())表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不会再执行了.
四、抛出异常
在编程过程中,有些异常暂时不需要处理,此时可以将异常抛出,让该类的调用者处理。Java提供了throws关键字和throw关键字用于抛出异常。
1.throws关键字
Java允许在方法的后面使用throws关键字声明该方法有可能发生的异常,这样调用者在调用该方法时,就明确地知道该方法有异常,并且在程序中对异常进行处理,否则编译无法通过。
语法格式:修饰符 返回值类型 方法名(参数1,参数2,...)throws 异常类1,异常类2,...{
方法体 }
throws关键字需要写在方法声明地后面,throws后面还需要声明方法中发生异常地类型。
例如:
在divide( )方法中声明抛出的异常,在main方法中调用divide方法并使用try...catch语句对divide方法中存在的异常进行处理(如果不使用即使不会出现0的异常运行时依然会出现错误)
2.throw关键字
throw关键字用于方法体内,抛出的是一个异常实例,并且每次只能抛出一个异常实例
语法格式: throw ExceptionInstance;
在方法中,通过throw关键字抛出异常后,还需要使用throws关键字或者try...catch语句对异常进行处理。如果throw抛出的是Error、RuntimeExce或它们的子类的异常对象,则无须使用throws关键字或try...catch语句对异常进行处理.
使用throw关键字抛出异常,通常有如下两种情况
1.当throw关键字抛出的是编译时异常,有两种处理方式 (1)在try代码块里使用throw关键字抛出异常,通过try代码块捕获该异常 (2)在一个有throws声明的方法中使用throw关键字抛出异常,把异常交给该方法的调用者进行处理
2.当throw关键字抛出的异常是运行时异常时,程序既可以使用try...catch语句捕获并处理该异常,也可以完全不理会,把该异常交给方法的调用者进行处理
例如:
代码中定义了printAge()方法,在该方法中对输入的年龄进行逻辑判断.当数值小于或等于0时,使用throw关键字抛出异常,并指定异常提示信息,同时在方法后继续使用throws关键字处理抛出的异常.在第15行代码中使用try...catch语句对printAge()方法抛出的异常进行捕获处理,并打印捕获的异常提示信息
输入26,程序正常运行
输入-1,输出结果如下