JAVA 中的异常(3)- 异常的处理方式二:throw/throws

1. throw 用法

throw 是用于抛出异常,将这个异常对象传递到调用者处,并结束当前方法的执行

public static void main(String[] args) {

  try {
    int i = 10 / 0;
    System.out.println("i = " + i);
  }catch(ArithmeticException e) { 
    // 抛出异常,传递自定义异常信息提示
    // 默认抛出给 JVM 处理打印异常详细信息    
    throw new ArithmeticException("除数不能为0");
  } 
  
}

throws抛出异常的规则:

  • 1)如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

  • 2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误

  • 3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。

  • 4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

2. throws 用法

throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。

public class ExceptionDemo {

    public static void main(String[] args) {
        demo();
    }
    
    public static void demo() throws ArrayIndexOutOfBoundsException{
        try {
            int[] arr = {1,2,3};
            int i = arr[3];
            System.out.println("i = " + i);
        }catch(ArrayIndexOutOfBoundsException e) { 
           System.out.println(e.toString());
        } 
    }
}

throws子句放在方法参数列表的右括号之后,一个方法可以声明抛出多个异常,多个异常之间用逗号隔开

public class Main {
    public static void readChar() throws IOException,RemoteException {
        int input = System.in.read(); 
    }
}

3. 关键字throw和throws的区别

throw:用在方法内,后面跟异常对象,用于抛出异常对象,相当于new一个异常对象。在方法内 出现某种情况,使程序不能继续运行,需要进行跳转时,用throw把异常对象抛出

throws:用在方法上,后面跟异常的类名,用于声明异常,标识方法会暴露出的异常。在定义方法时,需要把会出现的问题暴露出来让调用者去处理,就用throws在方法上标识出来。

4. 选择用try-catch-finally还是throw/throws

如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。

执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。


作者:快乐随行

https://www.cnblogs.com/jddreams/p/14281935.html


---- 作者:快乐随行 著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明原文作者及出处。 ----
原文地址:https://www.cnblogs.com/jddreams/p/14281935.html