A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 月时微 中级黑马   /  2013-6-17 19:26  /  2616 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

设下列try-catch语句块中的第二个语句s2将引起一个异常,则回答下列问题:try{ s1; s2; s3; }catch(ExceptionType e1){} catch(ExceptionType e2){} s4;
(1)s3会执 行吗
(2)如果异常未被捕获,s4会被执行吗?
(3)如果catch子句捕获了异 常,s4会执行吗?说明一下理由?

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

8 个回复

倒序浏览
1   s3不会执行,运行到s2出现异常之后,就跳到catch语句中(因为你写异常了,虽然是空,但是也算捕获异常),s4执行
2 如果不捕获异常,而是抛出的话,s4不会执行
3 捕获异常后,s4执行
回复 使用道具 举报
我简单用代码试了一下,实验代码在这里,楼主看一下
  1. class Demo2
  2. {
  3.         public static void main(String[] args) /*throws Exception*/{
  4.                 try{
  5.                         s1();
  6.                         s2();
  7.                         s3();
  8.                         }
  9.                 //finally{}
  10.                 catch (Exception e) {
  11.                         // TODO: handle exception
  12.                         System.out.println(e.getMessage());
  13.                         new Exception("s2异常");
  14.                 }
  15.                 s4();
  16.         }
  17.         public static void s1() {
  18.                 System.out.println("s1");
  19.         }
  20.         public static void s2() {
  21.                 int [] arr=new int[]{1,2,3};
  22.                 System.out.println(arr[5]);
  23.                 System.out.println("s2");
  24.         }
  25.         public static void s3() {
  26.                 System.out.println("s3");
  27.         }
  28.         public static void s4() {
  29.                 System.out.println("s4");
  30.         }
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
当没有捕获到异常的话 s4不会执行  当捕获到了异常的话  s4会执行  但是s3不会执行

原因是:
当在s2出发生了异常 会在当前位置跳到catch()捕获异常
如果捕获到了异常 则继续在catch()的当前位置向下执行 所以会执行s4 但是s3已经跳过 所以不会执行

如果没有捕获到异常的话 ,则在当前位置终止,所以不会执行s4 更别说s3了

例如:当捕获到了异常
public static void main(String [] agrs){
                try{
                        int a=3;//s1
                        int b=0;//s1
                        int c=a/b;//s2
                        System.out.println("执行S3");
                }catch(Exception e){
                        e.printStackTrace();
                }
                System.out.println("执行S4");
        }结果是:

java.lang.ArithmeticException: / by zero
        at student.main(student.java:7)
执行S4


当没有捕获到异常:
public static void main(String [] agrs){
                try{
                        int a=3;//s1
                        int b=0;//s1
                        int c=a/b;//s2
                        System.out.println("执行S3");
                }catch(IllegalArgumentException e){
                        e.printStackTrace();
                }
                System.out.println("执行S4");
        }结果是:

Exception in thread "main" java.lang.ArithmeticException: / by zero
        at student.main(student.java:7)

希望能对你有帮助

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报 0 1
      先回答笔者第一个问题:当try程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的catch程序块,catch程序块里面的语句被执行。
当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句。try块中没有抛出异常,所以try中的语句都会执行,当然也包括了s3.
第二个问题:如果异常未被捕获,那么整个程序就是正常的S4当然会执行。同第三个问题
第三个问题:因为没有finally块(且块中有关闭资源的语句),所以不管catch子句有没有捕获到异常,都会执行S4.

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
最后一个catch部分是你的第二问的,也就是注释的部分。
  1. public class Test2 {
  2.         public static void main(String[] args) {
  3.             int num1=3,num2=0;
  4.       try{
  5.                       int result=num1/num2;                         //你指的s1位置
  6.                       System.out.println("result:"+result);         //你指的s2位置
  7.                       System.out.println("我是三儿啊  执行到了吗? "); //你指的s3位置

  8.              }catch(IllegalArgumentException e){
  9.                      e.printStackTrace();
  10.                  }catch(ArrayIndexOutOfBoundsException e){
  11.                          e.printStackTrace();
  12.                  }/*catch(ArithmeticException e){
  13.                           System.out.println("被除数不可以为零 请检查 ! ");
  14.                  }*/
  15.                
  16.                  System.out.println("I'M four can you running me ");//你指的s4位置
  17.         }
  18. }
复制代码
我们知道s3的位置无论如何都是执行不到的,因为程序出了检查出了异常就要去处理所以s3就执行不到了。
而对于未捕捉到异常时程序将把这个异常抛给虚拟机程序也就不再执行了所以s4也就执行不到了。
当捕捉到异常是程序将继续执行 下去了。所以呢 s4也就执行到了。
回复 使用道具 举报
forward 发表于 2013-6-17 20:13
当没有捕获到异常的话 s4不会执行  当捕获到了异常的话  s4会执行  但是s3不会执行

原因是:

我学得S3会执行,当执行S2语句时发生异常,那么就会把异常抛给下面的catch子句进行处理,处理完后,会跳转到S3,正常语句,这样才会使整个程序执行正常。
回复 使用道具 举报

  1. <P>try</P>
  2. <P>{ </P>
  3. <P>     s1; //无异常,往下执行</P>
  4. <P>     s2; //发生异常,需要捕捉,即跳转到catch(ExceptionType e2)</P>
  5. <P>     s3; //s2异常后直接跳到后面的catch了  ,因此不会执行</P>
  6. <P>}</P>
  7. <P>catch(ExceptionType e1)</P>
  8. <P>{</P>
  9. <P>} catch(ExceptionType e2)//处理异常</P>
  10. <P>{</P>
  11. <P>} </P>
  12. <P>s4;//你用的Exception,它能捕获所有异常。。假设你用的不是Exception ,且异常未被捕获,则程序结束了,s4执行不到</P>
  13. <P>     //如果catch(ExceptionType e2)捕获了异常,且处理时没有抛出,没有return  ,没有System.exit(0),就能执行到s4,上述三种情况是程序跳到他处或程序终止的代表。
  14. </P>
复制代码
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马