JavaSE 55 异常机制 → 捕获和抛出异常

9.2 捕获和抛出异常


  • 抛出异常
  • 捕获异常
  • 异常处理的五个关键字
  1. try //监视区域,先做监视观察 才能去捕获
  2. catch //捕获异常
  3. finally //无论怎么样 最终都要去做的事(善后工作
  4. throw //抛出异常(非常确定抛出的是什么异常,只是没有做异常的声明
  5. throws //在方法头上 书写(意味着该方法可能会抛出这些异常!这叫做异常的声明)

如果该方法在方法体内 完成了对其中一个异常的处理,那么这个被处理的异常!就可以不用写在 方法头上了!因为该异常不需要向外抛出,该方法自己已经解决了!

9.2.1 举例说明

JavaSE 55 异常机制 → 捕获和抛出异常
正常 a/b 肯定会 提示你 异常。

那么 我们怎么 去捕获这个异常,并且获得一些 信息呢?

  1. 首先 要监视它的所有行为!用 try 来监视!
  2. 用 catch 去捕获 它 异常的地方!这个异常的地方我们可以自己定义时什么异常,比如说 ArithmeticException 算术异常。
    catch(ArithmeticException e) //意思就是 说 当 我监视你整体的行为中,如果出现了 算术异常,那么我就将这个异常捕获下来!
  3. finally:就是做善后工作,出不出现异常,都要执行!所以可有可无。
package Exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {//try 作为监视区域,把需要监视的东西放在这里
            System.out.println(a/b);
        }catch (ArithmeticException e) {
            System.out.println("出现异常!变量b不能为0,分母不能为0!");
        }finally {
            System.out.println("无论出不出现异常,我都得执行!");
        }

    }
}

9.2.2 当我们不知道 需要捕获什么异常的时候怎么办呢?

可以使用 Throwable 这个最大的 异常类型 进行捕获!

  1. 如果你知道你捕获的肯定是异常 也可以用 Exception
  2. 如果你知道你不活的肯定是错误 也可以用 Error
package Exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {//try 作为监视区域,把需要监视的东西放在这里
            System.out.println(a/b);
        }catch (ArithmeticException e) {
            System.out.println("出现异常!变量b不能为0,分母不能为0!");
        }finally {
            System.out.println("无论出不出现异常,我都得执行!");
        }

        try{
            new Test().a();
        }catch(Throwable e)
        {
            System.out.println("栈溢出");
        }
    }
    public void a()
    {
        b();
    }
    public void b(){
        a();
    }
}
  • 如何判断是 异常 还是 错误 ??

可以通过 层次 捕获(捕获优先级) ,多次 判断,来确定是 异常 还是 错误!

Throwable > Exception > Error (捕获优先级)

例如:捕获栈溢出 是 error 还是 exception

package Exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {//try 作为监视区域,把需要监视的东西放在这里
            System.out.println(a/b);
        }catch (ArithmeticException e) {
            System.out.println("出现异常!变量b不能为0,分母不能为0!");
        }finally {
            System.out.println("无论出不出现异常,我都得执行!");
        }

//层次捕获 从低到高,如果从高到低,那么直接就捕获结束了!
        try{
            new Test().a();
        }catch(Error e)
        {
            
            System.out.println("error");
        }catch(Exception e)
        {
            System.out.println("exception");
        }catch(Throwable e)
        {
            System.out.println("栈溢出");
        }
    }
    public void a()
    {
        b();
    }
    public void b(){
        a();
    }
}

JavaSE 55 异常机制 → 捕获和抛出异常
事实证明,栈溢出 属于 error 错误 范畴,是 一个很严重的 错误!并非 异常 可比!

  • IDEA 自动包含代码快捷键

Ctrl+Alt+T 直接就会 让你选择 用什么结构 包含这行代码。
JavaSE 55 异常机制 → 捕获和抛出异常


9.2.3 捕获到后的 e 对象

e 是捕获到后该异常后,给你提供的 该异常类型的对象,这个对象有很多的方法!是Java 为你提供的,只是为了方便 你 开发程序,所以 Java 为你提供了 这么一个东西!

JavaSE 55 异常机制 → 捕获和抛出异常


9.2.4 主动抛出异常(throw/throws)

throw / throws 常常用于 方法中!而并非 随便挑选出来的某个代码块中。


9.2.4.1 throw

throw 只能抛出一个异常,并且不会自动做 异常的声明所谓异常的声明,所谓异常的声明就是用 throws 在 方法头部 那里 告诉外部 我这个方法可能会抛出哪些异常!

package Exception;

public class Throw {
    public static void main(String[] args) {
        new Throw().f(2,0);
    }

    public int f(int a,int b)
    {
        if( b == 0)
        {
            throw new ArithmeticException();//抛出一个 算术异常对象
        }

        int ret = 0;
        //int ret = a / b;
        return ret;
    }
}

JavaSE 55 异常机制 → 捕获和抛出异常
一旦抛出了异常,你就会发现 我们需要 catch 抓捕下来 并且 进行处理!
JavaSE 55 异常机制 → 捕获和抛出异常


9.2.4.2 throws

throws 作为 方法 可能抛出 异常的声明!
JavaSE 55 异常机制 → 捕获和抛出异常
简单了解下就行,就是 为 可能抛出的异常 做声明!而 方法体内,要在 特定的情况下,抛出这些异常,以便于 我们进行 捕获 和 处理!

上一篇:任务调度 Quartz


下一篇:Python数组的应用