java 异常

一.异常

  • 概念

    程序在执行过程中,出现的非正常的情况,最终会导致JVM的不正常停止。错误并不是异常,而是脱离程序员控制的问题。

  • 层次

    Exception类是所有异常类的父亲。
    Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
    Exception类和Error是 Throwable 类的子类:
    Error:严重错误,无法通过处理的错误,只能事先避免,好比绝症。
    Exception:异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。

  • 常用方法

    1.public void printStackTrace():打印错误输出流,就是打印异常的详细信息。
    2.public String getMessage():返回关于发生的异常的详细信息,就是提示错误原因。

  • 异常分类

    编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。
    运行时期异常:runtime异常。 运行时异常是可能被程序员避免的异常,,运行时异常可以在编译时被忽略。

  • 捕获异常

    使用 try 和 catch 关键字可以捕获异常。try/catch 代码块里放可能异常的代码。它们不能单独使用。
    语法:

    try{    
        编写可能会出现异常的代码
    }catch(异常类型  e){
        处理异常的代码
    }

    演示:

    try{
        int i =1 /0;
    }catch(ArithmeticException e){
        System.out.println("兄弟,零不能 为被除数");
    }
    System.out.println("路过");

    运行输出结果:

    兄弟,零不能为被除数
    路过
  • 多重捕获块

    一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
    语法:

    try{    
        编写可能会出现异常的代码
    }catch(异常类型  e1){
        处理异常的代码
    }catch(异常类型  e2){
        处理异常的代码
    }catch(异常类型  e3){
        处理异常的代码
    }

    释:
    1.可以在try语句后面加无数个catch块。
    2.如果try代码中发生异常,异常被抛给第一个 catch 块。
    3.如果抛出异常的数据类型与相仿的异常类型相匹配,它在这里就会被捕获。
    4.如果不匹配,它会被传递给第二个 catch 块。
    5.如此,直到异常被捕获或者通过所有的 catch 块。

  • throw/throws

    如果需要在程序中自行抛出异常,就是将这个异常对象告知给调用者,则应使用throw语句
    格式:

    throw new 异常类名(参数);

    可以使用 throw 语句实现如下代码:

    public class ThrowDemo {
     public static void main(String[] args) {
       int[] arr = {2,4,52,2};
       int index = 4;
       int element = getElement(arr, index);
       System.out.println(element);
       System.out.println("了结");
      }
      public static int getElement(int[] arr,int index){ 
      【判断索引是否越界】
       if(index<0 || index>arr.length-1){   
        【判断条件如果满足,方法已经无法继续运算。 
         会将异常告知给调用者。此时就用异常来解决。】        
         throw new ArrayIndexOutOfBoundsException("越界了~");
      }
       int element = arr[index];
       return element;
     }

    指明此方法执行时,可能会抛出的异常类型。如果一个方法没有捕获到一个编译时期异常,那么该方法必须使用throws关键字来声明并让调用者去处理。throws要放在方法的尾部。
    格式:

    修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{   }

    演示:

    public class ThrowsDemo {
     public static void main(String[] args) throws FileNotFoundException {
      read("a.txt");
    }
    
    【此功能有问题会报告给调用者,反之】
     public static void read(String path) throws FileNotFoundException {
      if (!path.equals("a.txt")) { 
         
          throw new FileNotFoundException("木有");
        }
       }
     }

    注:
    要是该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,就用逗号隔开。

  • finally

    1.finally要创建在catch代码块后面执行的代码块。
    2.无论是否发生何事,finally代码块中的代码总会被执行。
    演示:

    try{
      int i =1 /0;
    }catch(ArithmeticException e){
      throw new ArithmeticException("兄弟,零不能为被除数");
    }finally{
      System.out.println("我不管,我就要执行。");
      }
      System.out.println("路过");

    运行输出结果:

    【报错异常】Exception in thread "main" java.lang.ArithmeticException: 兄弟,零不能为被除数
    我不管,我就要执行。

    注:
    finally不能单独使用。

你可能感兴趣的:(java后端)