目录
异常分类:
区别:
异常产生过程的解析:
异常的处理:
抛出异常thorw关键字
Objects非空判断
声明异常throws
捕获异常try...catch
Throwable类中定义了3个异常处理的方法:
多个异常捕获:
finally代码块:
子父类的异常:
概念:程序执行过程中,出现非正常的情况,最终会导致JVM的非正常停止
在java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理
异常并不是语法错误,语法错误,编译不通过,不会产生字节码文件,根本不能运行
异常体系:
异常的根类(所有异常和错误的超类):java.lang.Throwable。其下有两个子类,java.lang.Error(错误)与java.lang.Exception(异常)。
异常分类:
Exception:编译期异常:进行编译(写代码)java程序出现的问题
RuntimeExcetion:运行期异常,java程序运行过程中出现的问题
Error:错误
区别:
异常处理掉后程序可以继续执行,错误必须修改源代码后程序才可以继续执行
异常产生过程的解析:
public static int getElement(int[] arr,int index){
int ele=arr[index];
return ele;
}
int[]arr={1,2,3};
int e=getElement(arr,0);//1
int e=getElemnet(arr,3);//数组越界异常
1.JVM会根据异常产生的原因创建一个异常对象,包含异常产生的内容,原因和位置
2.在getElement方法中,没有异常处理逻辑(try-catch),那么JVM就会把异常对象抛出给方法的调用者main方法来处理这个异常
3、main方法接受到了异常对象,main方法也没有异常的逻辑处理,继续吧对象抛出给JVM处理
4、JVM接受到了异常对象,(1)把异常对象(内容,原因,位置)以红色字体打印在控制台
(2)JVM会终止当前正在执行的java程序(中断处理)
异常的处理:
抛出异常thorw关键字
使用throw关键字在指定的方法中抛出指定的异常
throw new xxxException("异常产生的原因");
注意:
1、throw关键字必须写在方法的内部
2、throw关键字后边new的对象必须是Excetion或者Exception的子类对象
3、throw关键字抛出指定的异常对象,就必须处理这个异常对象
throw关键字后边创建的是RuntimeException或者是RuntimeException子类对象,可以不处理,默认交给JVM处理
throw关键字后边创建的是编译异常(写代码时报错),就必须处理这个异常,要么throws,要么try....catch
public static int getElement(int[] arr,int index){
对传递过来的参数数组,进行合法性校验
如果数组arr的值是NULL,那么就抛出空指针异常,告知方法的调用者"传递的数组值是null"
if(arr==null){
throw new NullPointerExcetion("传递的数组的值是null");//运行期异常
}
if(index<0||index>arr.length-1){
throw new ArrayIndexOutofBoundsException("传递的索引超出了数组的使用范围");//运行期异常
int ele=arr[index];
return ele;
}
int []arr=null;
int e=getElement(arr,0);
sout(e);
}
Objects非空判断
Objects是null-save(空指针安全的)或null-tolerant(容忍空指针的),在它的源码中,对象为null的情况进行了抛出异常操作
Objects类中的静态方法:
public static <T> T requireNonNull(T obj):查看指定引用对象是不是Null
public static <T> T requireNonNull(T obj):查看指定引用对象不是null
{
if(obj==null){
throw new NullPointerExcetion();
return obj;
}
}
ObJects.requireNonNull(null,"传递的对象是空")
声明异常throws
异常处理的第一种方式,把异常对象声明抛出给方法的调用者处理
格式:
修饰符 返回值 方法名(参数列表) throws AAAException,BBBException{
throw new AAAException("1");
throw new BBBException("2");
}
注意:
(1)throws关键字必须写在方法声明处
(2)throws关键字后面声明的异常必须是Exception或者Exception的子类
(3)方法内部如果抛出了多个异常,那么throws后面必须也声明多个异常
如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
(4)调用了一个声明抛异常的方法,就出是必须处理声明的异常
使用throws交给方法的调用者处理,或者使用try..catch自己处理异常
public static void readFile(String fileName) throws FileNotFoundFile,IOException{
if(!filename.equals("c:\\\\a.txt")){
throw new FileNotFoundException("传递的文件路径出错");
if(!fileName.endsWith("文件的后缀名不对")){
throw new IOException("文件的后缀名不对");
}
}
publc static void main(String[] args)throws FileNotFoundException,IOexception{
readFile("d://a.txt");
readfile("c://a.xt");
}
FileNotFoundFile是IOException的子类可以只写IOExption
捕获异常try...catch
捕获异常:java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方法的处理
try{
编写可能会出现异常的代码
}
catch(定义一个异常变量,用来接受try中抛出的异常对象){
处理异常的代码
//打印日志/打印异常信息/继续抛出异常
}
一般在工作中,会把异常的信息记录到一个日志中
1、try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
2、如果try中产生了异常,那么就会执行catch中异常处理逻辑,然后执行catch之后的代码
3、如果try中没有异常,那么就不会执行catch中异常的处理逻辑,执行catch之后的代码
public static void readFile(String fileName) throws FileNotFoundFile,IOException{
if(!filename.equals("c:\\\\a.txt")){
throw new FileNotFoundException("传递的文件路径出错");
if(!fileName.endsWith("文件的后缀名不对")){
throw new IOException("文件的后缀名不对");
}
}
publc static void main(String[] args){
try{
readFile("d://a.txt");
readfile("c://a.xt");}catch(IOException e){
Sout(e.toString);//java.io.IOExcption:文件的后缀名不对
Sout(e.getMessage());//文件的后缀名不对
e.printStackTrace();//最全面....
}
sout("后续代码");
}
Throwable类中定义了3个异常处理的方法:
String getMessage():返回次throwable的简短描述
String toString():返回此throwable的详细消息字符串
void printStackTrace():JVM打印异常对象,默认此方法,打印的异常信息是最全面的
异常注意事项:
多个异常捕获:
(1)多个异常分别处理
(2)多个异常一次捕获,多次处理
注意:
catch里面定义的异常变量,如果有子父类的关系,那么子类的异常变量必须写在上面,否则会报错
(3)多个异常一次捕获,一次处理
运行时异常可以被抛出可以不处理,即不捕获,也不声明抛出
默认交给虚拟机处理,终止程序
finally代码块:
无论是否出现异常都会执行
try{
编写可能会出现异常的代码
}
catch(定义一个异常变量,用来接受try中抛出的异常对象){
处理异常的代码
//打印日志/打印异常信息/继续抛出异常
}
finally{
}
注意:
1、finally不能单独使用,必须和try一起使用
2、finally一般用于资源释放(资源回收),无论程序是否出现异常,都要资源释放(IO)
3、如果finally有return语句,永远返回finally中的结果,避免该情况
子父类的异常:
注意:父类异常什么样,子类异常就什么样