异常的捕获与处理

异常的捕获与处理

处理异常

组合方式:try…catch、try…catch…finally、try…finally

public class TestMain {
    public static void main(String[] args) {
        try {
            System.out.println(5 / 0);
        } catch(ArithmeticException e) {
            System.out.println("出现算数异常:");
             e.printStackTrace();   //输出异常的完整信息
        }finally{
            System.out.println("运行结束");
        }
    }
}

异常处理流程

所有异常类都是Throwable子类

Error与Exception的区别?

  • Error:指的是JVM错误,即程序还没有执行,用户无法进行处理。
  • Exception:指的是程序运行中产生的异常,用户可以处理。

请解释Java中的异常处理流程:

这里写图片描述

  1. 程序运行过程中出现异常后,JVM自动根据异常类型实例化一个与之类型匹配的异常类对象。
  2. 产生异常对象后,判断是否有异常处理。
    • 有:由try语句捕获产生的异常类实例化对象,再与每一个catch进行比较。如果匹配,则处理异常。
    • 没有:交由JVM进行默认处理,输出异常信息,结束程序调用。
  3. 无论异常处理是否匹配,都要向后执行finally语句。如果之前处理过异常,那么程序自然结束,否则交由JVM默认处理。

使用Exception处理异常

public class TestMain {
    public static void main(String[] args) {
        try {
            System.out.println(5 / 0);
        } catch(Exception e) {
            System.out.println("出现balabala异常:");
             e.printStackTrace();   //输出异常的完整信息
        }finally{
            System.out.println("运行结束");
        }
    }
}

使用须知:

  • 存在多个catch时,捕获范围大的异常一定得放在捕获范围小的异常之后,否则程序编译错误。
  • Exception虽然比较方便,但所有异常都会按照同一种方式进行处理。异常分开处理更好。

Exception与RuntimeException的区别?并列举几个常见的RuntimeException

  • Exception是RuntimeException的父类
  • Exception所定义的异常必须要被处理,而RuntimeException的异常可以选择性处理。
  • 常见RuntimeException:ArithmeticException、NullPointerException、ClassCastException(转换异常类)

throws关键字

throws关键字主要用于方法声明,当方法中出现异常后,交由被调用处进行处理。

class MyMath {
    //此方法里产生的异常交给被调用出进行处理
    public static int div(int x, int y) throws Exception {
        return x / y;
    }
}
public class TestMain {
    public static void main(String[] args) {
        try {
            System.out.println(MyMath.div(10, 0));  //这里调用
        }catch(Exception e) {
            System.out.println("出错了!");
            e.printStackTrace();
        }

    }
}

由以上例子可以发现:

  • 调用了具有throws声明的方法后,不管操作是否会出现异常,都必须进行异常处理。
  • throws声明的方法所产生的异常的范围,必须必catch中的小。
  • 主方法如果抛出异常,则由JVM进行处理。(但主方法不应该用throws声明)

throw关键字

使用throw可以手动的抛出异常的实例化对象。

public class TestMain {
    public static void main(String[] args) {
        try {
            throw new Exception("自定义异常");   //抛出一个自定义异常
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

throw与throws的区别?

  • throw:指的是手动的抛出一个异常类对象。
  • throws:声明方法时使用, 表示此方法在调用时必须处理异常。

猜你喜欢

转载自blog.csdn.net/qq_34802416/article/details/80464239