其他分享
首页 > 其他分享> > 20220729 第五小组 罗大禹 学习笔记

20220729 第五小组 罗大禹 学习笔记

作者:互联网

20220729 第五小组 罗大禹 学习笔记

Java 抛出异常

学习重点

1.throw关键字
2.try...catch关键字

学习心得

今天老师上课讲的抛出异常还是很好理解的,感觉自己吸收的还算不错。

学习内容

Java 抛出异常(理解)

异常处理
  1. 下标越界
  2. 空指针
  3. 类型转换异常
  4. 数字格式化
  5. 算数异常(数学异常,除数为0)
编程界有三个事情的后果是非常严重的
  1. 除数为零
  2. IO流(输入输出流),没有关闭
  3. 停电(如今还好,以前很严重)

当一个程序抛出异常时,抛异常后面的语句不再执行,类似于return的功能,终止方法的执行。

import java.math.BigDecimal;

public class Ch01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        //若为double类型,结果为无穷大,因为小数会近似,0是无限接近与0,因此得数会无穷
        System.out.println(num1/num2);
        
        BigDecimal bigDecimal = new BigDecimal(1);
        BigDecimal bigDecimal1 = new BigDecimal(0);
        //BingDecimal不会出现上述问题,会直接抛异常
        //抛异常后,结束程序执行
        System.out.println(bigDecimal.divide(bigDecimal1));
        System.out.println("我很重要");
    }

}

异常的继承体系结构

最顶级的异常类Throwable(所有错误和异常的父类)
Error(错误也是类,万事万物皆对象) :

​ 正常情况下,不太可能出现的,绝大多数的Error都会导致程序处于非正常的状态下,很难恢复,
​ 它是在外力的作用下,不考虑(错误一定是代码写错了)。Error是Throwable的子类。它是在Java程序处理范围之外的

Exception:
Java语言中,将程序执行中发生的不正常的情况称之为异常。
编译期异常:

​ 写代码的时候会抛异常。如果编译期不解决,会编译不通过,一直报红

运行期异常:

​ RuntimeException,运行时会抛异常,平时没什么事

自定义异常:

Java中,异常机制虽然已经很完善了,但是一旦结合实际的业务,还是不够的。例如:年龄为-1

怎么自定义异常?

  1. 所有的异常必须是Throwable的子类(大材小用,没必要)
  2. 如果要定义一个编译期异常,需要继承Exception类,就是编译期异常
  3. 如果要定义一个运行期异常,需要继承RunTimeException类
// 自定义运行期异常类
public class MyRuntimeException extends RuntimeException{
    public MyRuntimeException(String message) {
        super(message);
    }
}

// 测试类
public class Ch03 {
    public static void fun(int i ,int j) throws MyException {
        if(j==0){
            // 若抛出运行期异常使用throw new MyRuntimeException("除数不能为0 ");即可
            throw new MyRuntimeException("除数不能为0");
        }
        System.out.println(i/j);
    }

    public static void main(String[] args) {
        try {

            fun(1,0);
        }catch(MyRuntimeException myRuntimeException){
            myRuntimeException.printStackTrace();
        }

    }
}
throw:

​ 在程序中可用throw来抛出一个异常

try...catch

catch可以写多个,是有顺序问题的,将范围小的写在上方。

在一个语句块中,如果私用throw抛出一个编译期异常,有两种处理方式

  1. 在方法的声明处使用throws关键字来标记异常类型

  2. 使用try...catch来解决异常

public class Ch02 {
    public static void main(String[] args) {
        int num1 =10;
        int num2  =0;
        // 处理异常
        try {
            // 把有可能抛异常的代码放到try语句块里
            // 如果出现异常会直接跳到catch,然后继续向下走
            System.out.println(num1/num2);
        }catch( Exception e/* 类似于形参 */){
            System.err.println("除数不能为0");
            e.printStackTrace();// 在命令行打印异常信息在程序中出错的位置及原因。
        }

        // 由于异常被解决,因此会继续执行程序
        System.out.println("我很重要");
    }
}
finally关键字

​ finally用来创建在try代码块后面执行的代码块

​ 无论是否发生异常finally中的代码块一定会执行,一般finally中的代码是用来释放资源

​ 无论catch抓没抓住异常,都会走finally

​ 若有return,运行顺序为

​ try--catch--finally--return

try {
    throw new RuntimeException();
}catch(RuntimeException runtimeException) {
    System.out.println("运行异常");
}finally {
    System.out.println("啦啦啦")
}
我们为什么要手动抛异常?

因为要配合全局异常处理机制来解决问题

public class Ch03 {
    public static void fun(int i ,int j) throws MyException {
        if(j==0){
            //若抛出运行期异常使用throw new MyException("除数不能为0 ");即可
            throw new MyException("除数不能为0");
        }
        System.out.println(i/j);
    }

    public static void main(String[] args) {
        try {

            fun(1,0);
        }catch(MyException e){
            e.printStackTrace();
        }

    }
}
异常链

一个异常被抛出去之后会被继续调用这个方法的方法捕获或抛出

方法的重写(补充)

  1. 方法的重写不能抛出必被重写方法更大的异常类型

标签:20220729,System,笔记,try,println,大禹,catch,异常,public
来源: https://www.cnblogs.com/ldydj/p/16534944.html