java异常处理(笔记)

(学习笔记)java中的异常捕获和处理

一、什么是异常?

异常有可以称为例外,差错,违例。它对应的是Java中的运行错误机制。程序的运行出现了超出预期的结果,它是不被期望的,会阻碍程序的正常运行。

传统语言中(例如C)要进行异常处理就会用到大量的if语句,这使得程序可读性差,维护性差等等。

java中谈到异常就离不开 try 、catch、finally、throw、throws这几个关键词。

异常的最上面一层类是Throwable,它下面又分为Error和Exception.

Error:JVM的错误

Exception:异常(我们一般说的异常就是Exception及其子类)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3m1RaCH-1616168565053)(C:\Users\杨丰\AppData\Roaming\Typora\typora-user-images\image-20210319221709300.png)]

java处理异常的大致流程:

程序允许时系统从调用栈中去找,从抛出异常的方法开始回溯,直到找到异常的捕获语句,如果异常得以正常处理,继续运行其他程序。假若异常得不到处理,则会交给JVM处理,一般会打印异常信息,结束程序。

二、异常捕获

抛出异常:

throw 异常对象;

异常捕获的基本语法:

try{
    语句组;
}catch(异常类名 异常形式参数名){
    异常处理语句组;
}catch(异常类名 异常形式参数名){
    异常处理语句组;
}finally{
    异常处理语句组;(资源关闭语句;)
   
    
}

try中放着被“监视”的、可能会产生异常的代码语句。

catch可以写多个,用来处理多个异常,这里要求子类异常要写在父类异常前面,同级异常不要求顺序。这里涉及到异常抑制。当对外部资源进行处理(例如读或写)时,如果遭遇了异常,且在随后的关闭外部资源过程中,又遭遇了异常,那么你catch到的将会是对外部资源进行处理时遭遇的异常,关闭资源时遭遇的异常将被“抑制”。但异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中,你可以通过被try代码块抛出的异常的Throwable.getSuppressed方法找回被压抑的异常,如e.getSuppressed()。

fanally无论有没有异常产生,都会执行,即使被监视语句中有return、break等结束语言。程序会先执行fanally中的语句,在执行到return等语句处。假若finally中也有return等语句,则不会跳回try和catch中执行。

java还有一种处理机制:try…with…resource

try(类型 变量名 = new 类型()){
  执行的语句块;
}

这个机制自动添加执行了finally{变量.close();},这里的外部资源的句柄对象要求必须实现AutoCloseable接口。

三、异常分类

异常分为Error(错误)和Exception,他们都继承Throwable,我们一般说的异常就是Exception及其子类.

java异常检查分为受检异常和运行时异常

运行时异常:RuntimeException及其子类,可以不明确处理。

受检异常:除了RuntimeException及其子类,其他异常都是受检异常,这种异常要求进行明确语法处理,要么捕获处理,要么抛出。

子类在覆盖父类方法时,父类若声明了throws异常,也可以throws异常。

四、自定义异常

Java 中可以自定义异常,自定义异常需要扩展Exception类或许其除RuntimeException以外子类(这时自定义类属于受检异常),如果要自定义非检查异常,则扩展自RuntimeException。

自定义的异常应该总是包含如下的构造函数:

1.无参构造函数
2.带有String参数的构造函数,并传递给父类的构造函数。
3.带有String参数和Throwable参数,并都传递给父类构造函数

有时对于异常,不仅仅要捕获处理,还需要重抛异常,让调用者也能感受这种异常。这时可以在catch或者finally中:

1.再次抛出这个异常

throw e;

2.重新生成一个异常,并抛出

throw new Exception(“some message”)

3.重新生成一个异常,携带当前异常的信息,抛出

throw new Exception(“some message”,e)

可用e.getcause获得内部异常信息

五.断言(assertion)

断言是程序调试的一种手段.

assert的格式:

1.assert 表达式;

2.assert 表达式:错误信息;

如果表达式为false,产生异常,打印相关错误信息。断言默认不启动,需要启动断言,使用

-ea(enableasserttions)

如:java -ea -classpath . Asserttion

最后

新人学习笔记,记录成长。欢迎大家指正,交流!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值