Java异常处理方式

139 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

对于那种项目经验比较多的大佬,这文章就直接跳过吧,主要是针对小白或者面试前熟悉的实习、初级开发

在Java应用中,异常的处理机制分为声明异常,抛出异常和捕获异常。

image.png

Java 通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。
在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、 catch、throw、throws 和 finally。

throw和throws的区别:
(1)位置不同:

  • throw:方法内部

  • throws:方法的签名处,方法的声明处 (2)内容不同:

  • throw+异常对象(检查异常,运行时异常)

  • throws+异常的类型(可以多个类型,用英文逗号拼接) (3)作用不同:

  • throw:异常出现的源头,制造异常。

  • throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理--要么自己处理要么再继续向外抛出异常

image.png

从这里可以看到 InterruptedException 变成灰色了,因为 InterruptedException 是 Exception的子类,所以,也可以直接声明父类异常,因为父类异常范围>子类异常范围

image.png

1.throws声明异常

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。注意非检查异常(Error、RuntimeException 或它们的子类)不可使用 throws 关键字来声明要抛出的异常。一个方法出现编译时异常,就需要 try-catch / throws 处理,否则会导致编译错误

2.throw抛出异常

如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。 throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常。

3.try/catch捕获异常

程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。如何选择异常类型可以根据下图来选择是捕获异常,声明异常还是抛出异常

通常使用throws抛给上层调用者处理,但我们知道没办法永远抛下去,总有一层需要自己处理,而这时候就该使用try/catch代码块处理本层异常

1.try代码块包裹的是可能出现异常的代码块
2.catch代码块包裹的是出现异常之后的操作

image.png

抛给上层之后:当然了,一般main方法是最上一层调用了,再抛上去就是JAVA自己帮我们处理了

image.png

而上面捕获异常还有个finally关键字,这个关键字像catch一样,必须跟在try关键字之后,而我们得知道,try在某一步出现异常之后,之后的代码将不会再执行

image.png

那么这就会导致问题了,我们学io流、jdbc链接都是有关闭资源这一步,如果出现异常,那就没办法资源--造成浪费,于是乎finally关键字就很有用了
3.finally表示必须执行,无论是否出现异常,finally里的代码必然全部执行,通常资源关闭操作就放在finally里面

image.png

可以看到,io.close()下面报红,也就是说,这个操作其实也需要抛出异常或者使用try/catch捕获异常,我这里就直接抛出异常了

image.png

还有个点就是,上面我们可以看到,try可以和catch搭配而不用finally,而其实try也可以单独和finally搭配而不用catch

image.png