tzkf

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

异常

快捷键: 选中代码块 然后crtl + alt + t 在选中try-catch

执行过程中所发生的异常事件可分为两大类

  1. Error(错误): Java虚拟机无法解决的严重问题。如: JVM系统内部错误、资源耗尽等严重情况。比如: StackOverflowError[栈溢出]和OOM(out ofmemory), Error 是严重错误,程序会崩溃。
  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception 分为两大类:运行时异常 [程序运行时,发生的异常] 和编译时异常 [编程时,编译器检查出的异常]。
异常体系图一览

image-20220406195300774

  1. 异常分为两大类,运行时异常和编译时异常.
  2. 运行时异常, 编译器检查不出来。 一般是指编程时的逻辑错误, 是程序员应该避免其出现的异常。java.lang.RuntimeException类及 它的子类都是运行时异常
  3. 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
  4. 编译时异常, 是编译器要求必须处置的异常。
常见的运行时异常
  1. NullPointerException 空指针异常
  2. ArithmeticException 数学运算异常
  3. ArrayIndexOutOfBoundsException 数组下标越界异常
  4. ClassCastException 类型转换异常
  5. NumberFormatException 数字格式不正确异常
代码实例

NullPointerException 空指针异常

public class NullPointerException_ { 
  public static void main(String[] args) { 
    String name = null; System.out.println(name.length()); 
  }
}

ArrayIndexOutOfBoundsException 数组下标越界异常

public class ArrayIndexOutOfBoundsException_ {
  public static void main(String[] args) { 
    int[] arr = {1,2,4};
    for (int i = 0; i <= arr.length; i++) { 
      System.out.println(arr[i]); 
    }  
  } 
}

ClassCastException 类型转换异常

public class ClassCastException_ {
  public static void main(String[] args) { 
    A b = new B(); //向上转型 
    B b2 = (B)b;//向下转型,这里是 OK 
    C c2 = (C)b;//这里抛出 ClassCastException } }
    class A {} 
    class B extends A {}
    class C extends A {}

NumberFormatException 数字格式不正确异常

public class NumberFormatException_ { 
  public static void main(String[] args) { 
    String name = "tzk"; 
    //将 String 转成int 
    int num = Integer.parseInt(name);//抛出 NumberFormatException 
    System.out.println(num);//1234 
  } 
}
异常处理的方式

image-20220406200107760

示意图

image-20220406200146035

image-20220406200216197

try-catch 方式处理异常-注意事项
  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.

  2. 如果异常没有发生,则顺序执行try的代码块,不会进入到catch.

  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)

    则使用如下代码finally{}

  4. 可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异
    常在后,子类异常在前,比如(Exception 在后,NullPointerException 在
    前),如果发生异常,只会匹配一个catch

  5. 可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会
    直接崩掉/退出。应用场景,就是执行一-段代码,不管是否发生异常,都必须
    执行某个业务逻辑

throws 异常处理
  1. 如果一 个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
  2. 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
注意事项和使用细节
  1. 对于编译异常,程序中必须处理,比如try-catch或者throws

  2. 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

  3. 子类重写父类的方法时,对抛出异常的规定子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型[举例]

    class Father { //父类
      public void method() throws RuntimeException { } 
    }
    class Son extends Father {//子类 
      //3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法, 
      // 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型 
      //4. 在 throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必 throws
      @Override public void method() throws ArithmeticException { }
    }
    
  4. 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必,throws

public class ThrowsDetail { 
  public static void main(String[] args) { 
    f2(); 
  }
  public static void f2() /*throws ArithmeticException*/ {
    //1.对于编译异常,程序中必须处理,比如 try-catch 或者 throws 
    //2.对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理 
    int n1 = 10; 
    int n2 = 0; 
    double res = n1 / n2; 
 }
  public static void f1() throws FileNotFoundException { 
    //这里思考问题 调用 f3() 报错 
    //1. 因为 f3() 方法抛出的是一个编译异常 
    //2. 即这时,就要 f1() 必须处理这个编译异常 
    //3. 在 f1() 中,要么 try-catch-finally ,或者继续 throws 这个编译异常 
    f3(); // 抛出异常 
  }
  public static void f3() throws FileNotFoundException { 
    FileInputStream fis = new FileInputStream("d://aa.txt"); 
  }
  public static void f4() {
    //1. 在 f4()中调用方法 f5() 是 OK 
    //2. 原因是 f5() 抛出的是运行异常 
    //3. 而 java 中,并不要求程序员显示处理,因为有默认处理机制 
    f5(); 
  }
  public static void f5() throws ArithmeticException { } 
}
自定义异常
public class Throws01 {
    public static void main(String[] args) {
        int age = 180;
        if (!(age >= 18 && age =< 120)){
            //抛出异常(异常对象)
            throw new AgeException("年龄范围错误");
        }
        System.out.println("年龄范围正确");
    }
}

//自定义一个异常类 继承RuntimeException 运行时异常
//通过继承RuntimeException 可以使用默认的处理机制

class AgeException extends RuntimeException{
    public AgeException(String message) {
        super(message);
    }
}
throw 和 throws的区别
意义 位置 后面跟的东西
throws 异常处理的一种方式 方法声明出 异常类型
throw 手动生成异常对象的关键字 方法体中 异常对象
posted on 2022-04-10 22:25  T冰镇西瓜  阅读(31)  评论(0编辑  收藏  举报