JavaSE01_Day05(上)-异常处理概述、异常的捕获和处理、Exception常用API

一、异常处理概述

1.1 定义

       异常指代的是程序运行的过程中发生了无法继续执行代码的情况,我们就称之为异常(异于平常,和正常情况不一样)。

1.2 异常处理机制

       当程序中出现异常以后,对程序的一个补救措施,防止程序出错以后无法继续进行执行后续代码,导致程序瘫痪。

1.3 异常分类

 

二、异常的捕获和处理

2.1 try-catch

 try{
     //可能会发生异常的代码片段
     String str  =  null;
     str.length();
 }catch(NullPointerException e){//子类异常
     //捕获空指针异常,并进行代码片段的处理
 }catch(ClassNotFoundExecption e){//子类异常
     //捕获类加载不到异常,并进行代码片段的处理
 }catch(FileNotFoundExecption e){//子类异常
     //捕获文件加载不到异常,并进行代码片段的处理
 }catch(Execption e){//父类异常
     //捕获Execption异常,防止程序在执行的过程中发生了上面没有进行捕获的异常,从而避免了程序的瘫痪。
 }

注意事项:

  1. try-catch块中try块中是对代码片段发生异常的一个捕获

  1. try-catch块中catch块中是对发生异常后的一个处理

  1. try-catch块可以存在多个catch块

  1. catch块中对于异常的类型书写需要满足子类型在上,父类型在下,如果没有按照这个书写代码会编译报错。

2.2 try-catch代码片段

 package cn.tedu.exception;
 /**
  * try-catch块案例演示
  * @author cjn
  *
  */
 public class TryCatchDemo {
 
     public static void main(String[] args) {
         //1.定义可能会发生报错的代码片段
         //2.使用try-catch语句块进行捕获处理
         try {
             String str =  null;
             str.length();
             Integer.parseInt(str);
             str.charAt(10);
        } catch (StringIndexOutOfBoundsException e) {
             System.err.println("虽然程序出现了字符串下标越界异常,但是不影响我程序的继续执行!!!");
        } catch (NumberFormatException e) {
             System.err.println("发生了数字格式化异常,但是不影响我程序的继续执行!!!");
        } catch (Exception e) {
             System.err.println("由父类异常捕获出错的场景");
        }
         /*
          * 当对象为null时,调用属性及其方法会报空指针异常
          */
         System.out.println("程序执行完毕!!!");
    }
 
 }

注意

  1. System.out.println();使输出的内容为黑色字体

  1. System.err.println();会使输出的内容变为红色字体

  1. 当上面两条语句同时存在时,输出的先后顺序每次可能不一样,这是因为多线程的缘故,输出的先后顺序并不影响最终结果!!!

2.3 try-catch-finally块

语法结构:

 try{
 
 }catch(子类异常){
 
 }catch(父类异常){
 
 }finally{
     //无论try中的代码片段是否会抛出异常,都会进行执行finally块中的代码逻辑,也就是当整个业务中有必须要进行执行的代码片段时,把这段逻辑写到finally块中
 }

应用场景:

       比如关闭打开的文件资源,或者有需要删除在程序执行过程中生成的临时文件等,我们需要把这些代码逻辑写到finally块中。

代码片段:

 package cn.tedu.exception;
 /**
  * try-catch-finally块的案例应用
  * @author cjn
  *
  */
 public class TryCatchFinallyDemo {
 
    public static void main(String[] args) {
        try {
            String str = null;
            str.length();
        } catch (NullPointerException e) {
            System.err.println("空指针异常发生!!!");
        } catch (Exception e) {
            System.err.println("不知道是什么异常,反正有个异常!!!");
        } finally {
            System.out.println("finally块中的代码逻辑执行了!!!");
        }    
    }
 
 }

测试步骤:

  1. 在catch块后方添加finally语句块,然后执行程序

  1. 修改字符串的赋值,不为null,然后执行程序

  1. 把catch块添加到try块后方,catch块前方,查看程序是否编译报错

  1. 删除catch块,查看程序是否编译报错

结论:

      finally块需要添加到try块后方,如果try块后有catch块,一定要添加到最后一个catch块的后方,catch块可以不存在。

System.exit(0);:当程序终止时,可以不执行finally块里的代码逻辑,一般不会手动终止程序,这条语句前一般不要有异常发生。

测试代码:

public static void main(String[] args) {
  try {
    String str = "111";
    System.exit(0);
    str.length();
  } finally {
    System.out.println("finally块中的代码执行了");
  }

  System.out.println("执行完毕!");
}

测试结果:无任何输出

2.4 经典场景应用

 package cn.tedu.exception;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 
 /**
  * 使用try-catch-finally进行关闭资源案例
  * @author cjn
  *
  */
 public class AutoCloseDemo {
 
    public static void main(String[] args) {
         
        /*
          * 在jdk1.7以后提供了自动关闭资源的功能,使用的时候把资源的创建添加到try后面,
          * 并且用()括起来,当资源对象使用完毕以后会自动的进行调用close方法关闭资源,
          * 该方案也是以后工作中经常使用的方案。
          */
        try (
        FileOutputStream fos = new FileOutputStream("execption.txt");
        ){
            fos.write(97);
        } catch (FileNotFoundException e) {
            System.err.println("文件加载不到异常!!!");
        } catch (Exception e) {
            System.err.println("不知道是什么异常,反正有错!!!");
        }
 
    }
 
 }

 

三、Exception常用的API

       异常类中提供了两个常用的API方法,其中,getMessage()可以查看错误信息,是以字符串的形式进行返回的,所以当你要调用该方法进行查看错误信息时,需要在输出语句中进行调用该方法打印输出。另一个方法printStackTrace(),该方法可以详细的打印错误的堆栈信息。

 package cn.tedu.execption;
 /**
  * 异常常用API案例演示
  * @author cjn
  *
  */
 public class ExceptionAPIDemo {
 
    public static void main(String[] args) {
        try {
            String[] strs = {"123","456","789","零"};
            for (int i = 0; i < strs.length; i++) {            
                Integer.parseInt(strs[i]);      
            }
        } catch (NumberFormatException e) {
            System.err.println(e.getMessage());
        } catch (Exception e) {
            //打印错误的堆栈信息
            e.printStackTrace();
        }
 
    }
 
 }

输出结果:

 //1.System.err.println(e.getMessage());
 For input string: "零"
     
 //2.e.printStackTrace();
 java.lang.NumberFormatException: For input string: "零"
  at java.lang.NumberFormatException.forInputString(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at cn.tedu.exception.ExceptionAPIDemo.main(ExceptionAPIDemo.java:9)
 
 //3.不捕获异常时,报错
 Exception in thread "main" java.lang.NumberFormatException: For input string: "零"
  at java.lang.NumberFormatException.forInputString(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at cn.tedu.exception.ExceptionAPIDemo.main(ExceptionAPIDemo.java:9)
 

posted @ 2021-06-22 23:16  Coder_Cui  阅读(175)  评论(0编辑  收藏  举报