2021-04-08

这篇博客详细介绍了Java异常处理的原理和实践,包括异常的体系结构、如何区分错误与异常、try-catch-finally的使用方式,以及自定义异常的创建和抛出。同时,文章还通过实例演示了异常的捕获和资源释放,强调了finally块在确保资源清理方面的重要性。

//父类方法没有抛出异常,则子类重写时不能抛出异常,只能捕获异常
/*
异常的体系:
----------| Throwable 所以异常或者错误类的超类
--------------|Error 错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通过代码去处理错误的。
--------------|Exception 异常 是需要通过代码去处理的。

如何区分错误与异常呢:
如果程序出现了不正常的信息,如果不正常的信息的类名是以Error结尾的,那么肯定是一个错误( ThreadDeath 也是错误)。
如果是以Exception结尾的,那么肯定就是一个异常。

java虚拟机在默认的情况下只能管理64m内存。
byte[] buf = new byte[102410241024];//1G

  • /
    /

    一个try块可以捕获多种异常的类型,但是捕获的异常类型必须从小到大进行捕获,否则编译报错。
    finally块的 使用前提是必须要存在try块才能使用。
    finally非常适合做资源释放的工作,这样子可以保证资源文件在任何情况下都 会被释放。
    /
    /

try块的三种组合方式:

第一种: 比较适用于有异常要处理,但是没有资源要释放的。
try{

		可能发生异常的代码

		}catch(捕获的异常类型 变量名){
			处理异常的代码
		}

第二种:比较适用于既有异常要处理又要释放资源的代码。

	try{

		可能发生异常的代码

		}catch(捕获的异常类型 变量名){
			处理异常的代码
		}finally{
			释放资源的代码;
		}

第三种: 比较适用于内部抛出的是运行时异常,并且有资源要被释放。
try{

		可能发生异常的代码

		}finally{
			释放资源的代码;
		}

*/

package demo.oo;

//自定义异常类
class CustomException extends Exception {
    CustomException(String message) {
        super(message);
    }
}

class ExceptionTest {
    private static void test2() {
        test();
    }

    private static void test() {
        //打印异常的栈信息
        new Throwable().printStackTrace();
        System.out.println("这一行的问题导致以下调用行出现问题,层层查询");
    }

    public static void main(String[] args) {
//        Throwable throwable1 = new Throwable();
        //toString()返回当前异常对象的完整类名(包名+类名)+ 病态信息
//        System.out.println(new Throwable("头晕").toString());
        //getMessage()返回的是创建Throwable传入的字符串信息。
//        System.out.println(new Throwable("感冒").getMessage());

        //test2();  //打印异常的栈信息
        //catchException(); //捕捉异常

        try {
            throwException(); //抛出异常

            //String other = null;
            //throwCustomException(other); //抛出自定义异常
        } catch (CustomException e) {
            e.printStackTrace();
            System.out.println("自定义异常的修正方法:插入网线");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("除非退出jvm,否则finally块一定执行");
            //System.exit(0);// 退出java虚拟机
        }
        System.out.println("对异常捕捉处理后,下面程序正常执行。但是方法内throw后面的代码不执行");
        if (true) {
            //throw new ArithmeticException();    //运行时异常无需声明
            //throw new Exception();    //编译时异常,必须声明(throws Exception)
        }
    }

    //抛出自定义异常
    private static void throwCustomException(String ip) throws CustomException {
        if (ip == null) {
            throw new CustomException("自定义异常抛出:没有插网线");
        }
        System.out.println("不执行");
    }

    //抛出异常
    private static void throwException() throws Exception/*, NullPointerException...*/ {
        if (true) {
            throw new Exception();//抛出一个异常对象...
        }
        System.out.println("不执行");
    }

    //捕捉异常
    private static void catchException() {
        int a = 2, b = 0, c;
        try {
            c = a / b;  //jvm在这句话的时候发现有不正常的情况,那么就会创建一个对应的异常对象。
            System.out.println("不执行");
        } catch (ArithmeticException e) {
            //处理异常的代码....
            System.out.println("异常处理了....");
            System.out.println("toString: " + e.toString());
        } catch (NullPointerException e) {
            System.out.println("出现了空指针异常....");
        } catch (Exception e) {
            System.out.println("我是急诊室,包治百病!");
        }
        System.out.println("处理后继续执行后面代码");
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值