返回顶部

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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

达内教育:成立于2002年。致力于面向IT互联网行业,培养软件开发工程师、测试工程师、系统管理员、智能硬件工程师、UI设计师、网络营销、会计等职场人才 达内使命:缔造年轻人的中国梦、缔造达内员工的中国梦 达内愿景:做管理一流的教育公司
  • 商务合作

  • 微信公众号

  • Powered by Discuz! X3.4 | Copyright © 2002-2021, 达内教育 Tedu.cn
  • 京ICP备08000853号-56 |网站地图 | 京公网安备 11010802029508号