Java的异常机制与自定义异常类

33.Java的异常机制

  • 什么是异常,实际工作中,遇到的情况不是完美的,例如:我们在开发时希望用户输入一个数字,结果用户输入了一个字符串;又或者当我们去打开某些并不存在的文件,读取不存在的数据等待。
  • 英文 Exception,当遇到这些特殊情况是给予其合理的解决方案,而不至于导致程序崩溃
  • 异常三大类
    1. 检查异常:最经典的是用户错误或问题所引起异常,这是程序员无法预见的,例如要读取某个文件,这个文件被用户删掉了,这些异常编译时不能被简单的忽略
    2. 运行时的异常:运行时异常是可能被程序员避免的异常,这类异常编译时会被编译器忽略。
    3. 错误:错误不是异常,而是脱离了程序员控制的问题,错误在代码中通常被忽略。例如:栈溢出,这种异常,编译器无法在编译时捕捉到。

查看源图像

  • Java中将异常当作对象来处理,并定义了一个java.lang.Throwable作为所有异常的超类

  • Java的API中定义了许多异常,这些异常分为两大类,一类是Error 和异常Exception

  • Error类对象是java虚拟机生成并抛出的,大多数错误与我们的代码没关系

  • Java虚拟机运行错误(Virtual MachineError),当JVM不再继续执行所需的内存资源时,将出现OutOfMemoryError,这些异常出发生时,JVM一般会选择线程终止。

  • Exception类对象也给我们划分了IOException和RuntimeException

  • Exception和Error的区别,Error是毁灭性的,一般发生时,程序会直接终止,Exception发生时,一般并不会终止程序而可以被我们所捕获处理。

  • 我们可以通过try…catch…finally 来捕捉处理异常,其中finally为可选项,不管有没有发生异常都一定会被执行

package com.Exception.demo;


public class Demo1 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        try {
//            监察区
            new Demo1().a();
            System.out.println(a / b);
        } catch (ArithmeticException e) {
//              捕捉算术例外异常
            System.out.println("除数不能为0");
        } catch (StackOverflowError e) {
//            捕捉堆栈溢出异常
            System.out.println("堆栈溢出");
        } catch (Throwable e) {
//            捕捉其他异常
            System.out.println("未知异常");
        } finally {
//            善后处理后继程序
            System.out.println("不管有没有发生异常我都会执行");
        }
        System.out.println("我还会执行吗?当然");
    }

    public void a() {
        b();
    }

    public void b() {
        a();
    }

}
  • 当捕捉多个异常时,从上到下捕捉的异常必须是从小到大的

  • 除了可以用try…catch捕捉处理之外,我们还可以用throw和throws主动抛出异常

package com.Exception.demo;

public class Demo2 {

    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {
            new Demo2().Division(a, b);
        } catch (ArithmeticException e) {
            System.out.println("抓到你了");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        System.out.println("很ok");
    }
    public void Division(int a, int b) throws Exception {  // 处理不了的异常向更高级抛出
        if (b == 0) {
            throw new ArithmeticException();  // 主动抛出一个异常
        } else {

            System.out.println(a / b);
        }
    }
}

34.自定义异常

  • 自定义异常只需要写一个类去继承Exception类就行了
package com.Exception.demo;

public class MyException extends Exception {

    public MyException(int detail) {
        this.detail = detail;
    }

    private int detail;
//    当数字大于10时抛出

    @Override
    public String toString() {
//        异常的打印信息
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}
package com.Exception.demo;

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


        try {
            new Test().test(11);
        } catch (MyException e) {
            System.out.println("异常==>" + e);
        }
    }

    public void test(int i) throws MyException {
        if (i > 10) {
            System.out.println("传入参数为:" + i);
            throw new MyException(i);
        } else {
            System.out.println(i);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pointer-faker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值