Java拾贝第七天——异常

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

在程序实际运行过程中,可能存在大量的未知问题,所以在程序中对错误的处理是极其重要的。

Java提供的异常处理机制可以更好地解决这方面的问题。

认识异常

    public static void main(String[] args) {
        System.out.println("程序开始");
        int i = 0;
        int j = 10;
        int x = j / i;
        System.out.println("程序结束");
    }

程序运行结果:

程序开始
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at moudle1.Test7.main(Test7.java:8)

在上述代码中,因为被除数是0,所以程序中就出现了异常。

从结果上可以发现。一旦出现了异常,程序就立刻退出了,所以后面的程序结束并没有出现

如果想要程序正确执行,则必须处理异常

处理异常

在Java的异常处理中,实际上也是按照面向对象的方式进行处理,处理步骤如下:

  1. 一旦产生异常,首先会产生一个异常类的实例化对象
  2. 在try语句中对该对象进行捕获
  3. 产生的对象与catch语句中各个异常类进行匹配
  4. 如果匹配成功,则执行该catch语句中的代码
        try {
	//可能出现异常的代码
        } catch (异常类 异常对象变量) {
           //异常处理
        }

至此,使用try catch语句修改代码:

    public static void main(String[] args) {
        System.out.println("程序开始");
        int i = 0;
        int j = 10;
        try {
            int x = j / i;//可能出现异常的代码
        } catch (ArithmeticException e) {//数学异常
            System.out.println(e);//把异常对象打印出来
        }

        System.out.println("程序结束");
    }

程序运行结果:

程序开始
java.lang.ArithmeticException: / by zero
程序结束

从结果上可以看到,因为程序加入了异常的处理,当异常发生后,程序没有中断执行。

finally

实际上,try catch语句还要一个finally关键字,它是所有异常的最终出口

finally不是必须的

修改代码:

    public static void main(String[] args) {
        System.out.println("程序开始");
        int i = 0;
        int j = 10;

        try {
            int x = j / i;
        } catch (ArithmeticException e) {
            System.out.println(e);
        }finally {
            System.out.println("不管有没有捕获到异常,这finally会执行");
        }

        System.out.println("程序结束");
    }

程序运行结果:

程序开始
java.lang.ArithmeticException: / by zero
不管有没有捕获到异常,这finally会执行
程序结束

常见的异常类型:
NullPointerException:空异常
IndexOutOfBoundsException:下标越界异常
NumberFormatException:数字格式化异常
ArithmeticException:算术异常

当然,程序也不会只出现一个异常,肯定会同时存在多个异常,此时需要使用多个catch语句

        try {
		//可能出现异常的好多代码
		//好多代码...
        } catch (ArithmeticException e) {
            System.out.println(e);
        } catch (NumberFormatException e) {//作用域不同
            System.out.println(e);
        } catch (IndexOutOfBoundsException e) {
            System.out.println(e);
        }finally {
            System.out.println("所有异常的最终出口");
        }

这也太麻烦了吧!如果压根不止这三个异常岂不是要写非常多catch。

从多态那里我们知道向上转型

至此,修改代码:

        try {
		//可能出现异常的好多代码
		//好多代码...
        } catch (Exception e) {//直接捕获其父类
            System.out.println(e);
        }finally {
            System.out.println("所有异常的最终出口");
        }

异常类关系

仅展示部分
image

错误:可以被捕获以及处理
异常:程序对此无能为力

注意
*在多个catch语句中,异常应该从小到大进行捕获。

否则全部在上方进行捕获处理了,程序也会出现编译错误*

    public static void main(String[] args) {
        System.out.println("程序开始");
        int i = 0;
        int j = 10;

        try {
            int x = j / i;
        }catch (Exception e){
            System.out.println(e);
        } catch (ArithmeticException e) {
            System.out.println(e);
        }finally {
            System.out.println("不管有没有捕获到异常,这finally会执行");
        }

        System.out.println("程序结束");
    }

程序运行结果:

java: 已捕获到异常错误java.lang.ArithmeticException

一般开发中,使用Exception不管出现什么异常都可以直接捕获处理。

项目开发中,不建议使用Exception捕捉全部异常,因为异常问题会不具体。

try catch语句中

try {

        }catch (Exception e){
            System.out.println(e);
            e.printStackTrace();
}

System.out.println()是在控制台输出异常信息

建议调用printStackTrace()方法打印异常栈,这是一个简单有用的快速打印异常的方法。

posted @ 2023-10-20 17:51  rowbed  阅读(0)  评论(0编辑  收藏  举报