Java

Java异常抛出和捕获

2020-09-17  本文已影响0人  丿星纟彖彳亍

Java中把非正常情况分为两种,异常(Exception)和错误(Error)。


异常.png
class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

public class DefinedException {
    public static void main(String[] args) {
        try {
            throw new MyException("\n自定义异常类!");
        } catch(MyException e) {
            System.out.println(e);
        }
    }
}

1、 异常抛出

1.1 throws关键字

使用throws将异常进行抛出,throws声明的方法表示该方法不处理异常,而由系统自动将所捕获的异常信息抛给上级调用方法。抛出的异常由上级调用者处理,上级调用者可以进行处理或抛出异常,上级调用者可以抛出更广泛的异常。

如果main方法也不知道如何处理异常就也可以使用throws抛出异常,那么该异常就会交给JVM处理。JVM将打印异常的跟踪栈信息,并中止程序运行。

public class throwsDemo {
    public static void main(String[] args) {

        int[] a = new int[5];
        try {
            setZero(a,10);
        } catch(ArrayIndexOutOfBoundsException ex) {
            System.out.println("数组越界错误!");
            System.out.println("异常:"+ex);
        }
        System.out.println("main()方法结束。");
    }
    private static void setZero(int[] a,int index) throws ArrayIndexOutOfBoundsException {
        a[index] = 0;
    }
}

1.2 throw关键字

除了使用throws抛出异常外也可以使用throw自行抛出异常。throw语句可以单独使用, throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。

 public class ExceptionDemo {
      public static void main(String[] args) {
          int[] a = new int[5];
          try {
              setZero(a,10);
          } catch(ArrayIndexOutOfBoundsException e) {
             System.out.println("异常:"+e);
         }
         System.out.println("main()方法结束!");
     }

     public static void setZero(int[] a,int index) throws ArrayIndexOutOfBoundsException {
         System.out.println("setZero方法开始:");
         try {
             a[index] = 0;
         } catch(ArrayIndexOutOfBoundsException ex) {
             throw ex;
         } finally {
             System.out.println("setZero方法结束。");
         }
     }
}

对应抛出的异常实例,既可以显式捕获该异常,也可完全不理会该异常,把该异常交给该方法调用者处理。

2、 异常捕获

而对于Exception我们乐意使用try...catch进行捕获。try...catch不允许存在单独的try或者catch块,可存在多个catch块。try块中存放业务功能代码,catch块中存放异常处理代码。对于捕获的异常一般可以使用printStackTrace()方法追踪输出至标准错误流。

try...catch后可以添加finally,使用finally可以保证系统退出,finally块中代码绝对执行,捕获异常需要先补货小异常,否则小异常将无法被捕获。

public class DealException {
    public static void main(String args[]) {

        try {  //要检查的程序语句
            int a[] = new int[5];
            a[10] = 7;//出现异常
        } catch(ArrayIndexOutOfBoundsException ex) {//异常发生时的处理语句
            System.out.println("超出数组范围!");
            ex.printStackTrace();//显示异常的堆栈跟踪信息
       } catch(ArithmeticException ex) {//在异常捕捉的过程中要进行两个判断,第一是try程序块是否有异常产生,第二是产生的异常是否和catch()括号内想要捕捉的异常相同。
             //可以在一个try语句后跟上多个异常处理catch语句,来处理多种不同类型的异常。
             System.out.println("算术运算异常");
             ex.printStackTrace();
        } finally{  //这个代码块一定会被执行
            System.out.println("*****");
        }
        System.out.println("异常处理结束!");
    }
}

参考文档:

上一篇 下一篇

猜你喜欢

热点阅读