目录

异常分类:

区别:

异常产生过程的解析:

异常的处理:

抛出异常thorw关键字

Objects非空判断

声明异常throws

捕获异常try...catch

Throwable类中定义了3个异常处理的方法:

多个异常捕获:

finally代码块:

子父类的异常:


概念:程序执行过程中,出现非正常的情况,最终会导致JVM的非正常停止

在java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理

异常并不是语法错误,语法错误,编译不通过,不会产生字节码文件,根本不能运行

异常体系:

异常的根类(所有异常和错误的超类)java.lang.Throwable。其下有两个子类,java.lang.Error(错误)与java.lang.Exception(异常)。

【java笔记】异常处理_JVM

异常分类:

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)多个异常分别处理

【java笔记】异常处理_后缀名_02

2)多个异常一次捕获,多次处理

【java笔记】异常处理_java_03

 注意:

catch里面定义的异常变量,如果有子父类的关系,那么子类的异常变量必须写在上面,否则会报错

(3)多个异常一次捕获,一次处理

【java笔记】异常处理_java_04

 运行时异常可以被抛出可以不处理,即不捕获,也不声明抛出

默认交给虚拟机处理,终止程序

finally代码块:

     无论是否出现异常都会执行

try{
编写可能会出现异常的代码
}
catch(定义一个异常变量,用来接受try中抛出的异常对象){
 处理异常的代码
//打印日志/打印异常信息/继续抛出异常
}
finally{

}

注意:

1、finally不能单独使用,必须和try一起使用

2、finally一般用于资源释放(资源回收),无论程序是否出现异常,都要资源释放(IO)

3、如果finally有return语句,永远返回finally中的结果,避免该情况

【java笔记】异常处理_后端_05

子父类的异常:

注意:父类异常什么样,子类异常就什么样

 

【java笔记】异常处理_开发语言_06

 

【java笔记】异常处理_后缀名_07