设为首页
收藏本站
搜索
热搜:
Java
Python
UI
人工智能
Web
影视特效
抖音
网络营销
运营
本版
文章
帖子
群组
用户
登陆
注册
首页
Portal
互联网资讯
视频教程
技术社区
BBS
IT培训
学历提升
快速发布
个人中心
今日签到
私信列表
消息中心
搜索全站
课程咨询
返回顶部
大内高手社区
›
技术社区
›
Java大数据论坛
›
Java异常处理:捕获异常
半个句号
关注Ta
发帖数
8
粉丝
1
此人很懒,什么也没有留下
[Linux运维与安全论坛]
Linux cd命令:切换目录
[Linux运维与安全论坛]
Linux命令基本格式
[Java大数据论坛]
Java 8 新特性的属性
[Java大数据论坛]
Java 数据结构的组成
阅读作者更多精彩帖子
热门问答
更多热门问答
1
淘宝客注册流程步骤
22563人围观,发布于2021-09-26
1
APP运营核心要点有哪些
21033人围观,发布于2022-07-08
0
了解运营
13175人围观,发布于2021-09-18
0
网站的 TDK基本格式
12356人围观,发布于2021-09-23
0
SEO优化中网站地图在的主要作用
13664人围观,发布于2022-01-13
0
快速提高网站SEO优化排名的方法
16620人围观,发布于2022-01-13
技术文章
更多技术文章
告别“限速”,个人网盘进入云时代
2022-12-28
长难任务设计指南,必须收藏!
2022-12-28
新消费,走进「韧性时代」
2022-12-28
营销技能:营销4P之外,还有这些经典理论
2022-12-28
实例分享 | 社区产品编辑器的设计开发要点
2022-12-28
产品经理方法论——流程与审批流的区别
2022-12-27
返回列表
Java异常处理:捕获异常
[复制链接]
半个句号
Lv.2
显示全部楼层
发表于 2022-7-28 11:15:40
|
阅读模式
在Java中,凡是可能抛出异常的语句,都可以用try...catch捕获。把可能发生异常的语句放在try{...}中,然后使用catch捕获对应的Exception及其子类。
多catch语句
可以使用多个catch语句,每个catch分别捕获对应的Exception及其子类。JVM在捕获到异常后,会从上到下匹配catch语句,匹配到某个catch后,执行catch代码块,然后不再继续匹配。
简单地说就是:多个catch语句只有一个能被执行。例如:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(IOExceptione){
System.out.println(e);
}catch(NumberFormatExceptione){
System.out.println(e);
}
}
存在多个catch的时候,catch的顺序非常重要:子类必须写在前面。例如:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(IOExceptione){
System.out.println("IOerror");
}catch(UnsupportedEncodingExceptione){//永远捕获不到
System.out.println("Badencoding");
}
}
对于上面的代码,UnsupportedEncodingException异常是永远捕获不到的,因为它是IOException的子类。当抛出UnsupportedEncodingException异常时,会被catch(IOExceptione){...}捕获并执行。
因此,正确的写法是把子类放到前面:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(UnsupportedEncodingExceptione){
System.out.println("Badencoding");
}catch(IOExceptione){
System.out.println("IOerror");
}
}
finally语句
无论是否有异常发生,如果我们都希望执行一些语句,例如清理工作,怎么写?
可以把执行语句写若干遍:正常执行的放到try中,每个catch再写一遍。例如:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
System.out.println("END");
}catch(UnsupportedEncodingExceptione){
System.out.println("Badencoding");
System.out.println("END");
}catch(IOExceptione){
System.out.println("IOerror");
System.out.println("END");
}
}
上述代码无论是否发生异常,都会执行System.out.println("END");这条语句。
那么如何消除这些重复的代码?Java的try...catch机制还提供了finally语句,finally语句块保证有无错误都会执行。上述代码可以改写如下:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(UnsupportedEncodingExceptione){
System.out.println("Badencoding");
}catch(IOExceptione){
System.out.println("IOerror");
}finally{
System.out.println("END");
}
}
注意finally有几个特点:
finally语句不是必须的,可写可不写;
finally总是最后执行。
如果没有发生异常,就正常执行try{...}语句块,然后执行finally。如果发生了异常,就中断执行try{...}语句块,然后跳转执行匹配的catch语句块,最后执行finally。
可见,finally是用来保证一些代码必须执行的。
某些情况下,可以没有catch,只使用try...finally结构。例如:
voidprocess(Stringfile)throwsIOException{
try{
...
}finally{
System.out.println("END");
}
}
因为方法声明了可能抛出的异常,所以可以不写catch。
捕获多种异常
如果某些异常的处理逻辑相同,但是异常本身不存在继承关系,那么就得编写多条catch子句:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(IOExceptione){
System.out.println("Badinput");
}catch(NumberFormatExceptione){
System.out.println("Badinput");
}catch(Exceptione){
System.out.println("Unknownerror");
}
}
因为处理IOException和NumberFormatException的代码是相同的,所以我们可以把它两用|合并到一起:
publicstaticvoidmain(String[]args){
try{
process1();
process2();
process3();
}catch(IOException|NumberFormatExceptione){//IOException或NumberFormatException
System.out.println("Badinput");
}catch(Exceptione){
System.out.println("Unknownerror");
}
}
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
x
回复
使用道具
举报
发布主题
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
返回顶部
返回列表