Java异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,有时候错误是可以避免的。
比如说,如果你的代码少了一个;那么会报错java.lang.Error,但是如果你写了System.out.println(11/0);
那么你的程序就会爆出java.lang.ArithmeticException的异常
异常的发生有很多可能,最常见的是以下几种
用户输入了非法数据
要打开的文件不存在
网络通信时连接中断
JVM内存溢出
这些异常有些是因为用户错误引起的,有些是因为程序错误引起的,有些是因为物理错误引起的
要掌握Java异常,你必须掌握如下三种异常
检查性异常:最具代表性的检查性异常是用户错误引起的异常,这些异常对于程序员是不可见的,但编译程序的时候必须想到这些情况,比如用户打开了一个不存在的文件,就有检查性异常发生
运行时异常运行时异常是程序员犯的错误,与检查性异常相反,运行时异常是可以被避免的
错误:错误不是异常,异常是程序员可以掌控的,错误是程序员不能掌控的。当栈溢出的时候,一个错误就发生了,逻辑错误就连编译也检查不出来。
Exception类的层次
所有的异常类都是从java.lang.Exception类中继承的子类
异常Exception类是Throwable类的子类,除了Exception类以外,Throwable类还有另一个子类:Error类
错误在Java程序处理地 范畴之外
Error用来指运行环境发生的错误
程序很难从错误中恢复。
异常类有两个子类:IOException类和RuntimeException类
在Java内置类中,有大分常用的的检查性和运行时异常
Java内置异常类
Java定义了一些异常类在java.lang包中
标准运行时异常都在java.lang标准包里面,由于java.lang包每个程序默认导入,所以运行时异常和他的子类都可以直接用
下表是一些Java中的非检查性异常:
捕获异常
使用try和catch关键字可以捕获异常,
try和catch代码块放在异常可能发生的地方
try/catch模块中的代码被称为保护代码
语法如下:
try{
//程序代码
}
catch(ExceptionName e1){
//catch模块
}
catch模块中有异常类型的声明,如果程序代码中产生一个异常,那么后面的catch模块就会被检查,看是否符合catch中异常的定义,如果符合,就会把异常传给对应的catch,这和函数传参是一个道理。
实例
import java.util.*;
public class Main{
public static void main(String[] args) {
int [] a=new int[2];
try {
System.out.println(a[2]);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("这个参数是:"+e);
}
System.out.println("现在不是try模块啦");
}
}
多重捕获
一个try代码块后面跟多个catch函数的情况就叫多重捕获:
多重捕获的代码如下:
try{
//收到保护的代码
}
catch(Exceptionname 异常变量名字){
}
catch(Exceptionname 异常变量名字){
}
catch(Exceptionname 异常变量名字){
}
上面的代码包含三个catch模块,可以在try模块添加任意多个catch模块,当保护代码中产生异常的时候,会从第一个catch模块开始找,找到匹配的catch参数,就会执行其中的代码。
finally关键字
finally代码块用来创建在try~catch模块后面执行的模块
无论是否发生异常,final代码块中的代码一定被执行。
在finally代码块中可以运行清理善后类型的语句。
finally代码块出现在catch代码块最后,语法如下:
try{
}
catch(ExceptionName 异常变量名){
}
catch(ExceptionName 异常变量名){
}
catch(ExceptionName 异常变量名){
}
finally{
//和try中代码一样,必定会执行的代码
}
throw/throws关键字
throws关键字写在函数声明后面。
throw关键字写在函数内部
注意:throw抛出一个异常后,throw后面不能跟语句(就算跟了也不会执行)
finally代码块无论异常是否发生都会执行
声明自定义异常
在Java中你可以自定义异常,使用自定义异常的时候有以下需要注意:
1.所有的异常都必须是Throwable的子类
2.如果希望写一个检查性异常类,必须继承Exception
3.如果希望写一个运行时异常类,必须继承RuntimeException类
可以像下面这样定义自己的异常类
class MyException extends Exception{
}
只是继承Exception类的是检查性异常,