黑马程序员技术交流社区

标题: try-catch语句问题 [打印本页]

作者: 月时微    时间: 2013-6-17 19:26
标题: try-catch语句问题
设下列try-catch语句块中的第二个语句s2将引起一个异常,则回答下列问题:try{ s1; s2; s3; }catch(ExceptionType e1){} catch(ExceptionType e2){} s4;
(1)s3会执 行吗
(2)如果异常未被捕获,s4会被执行吗?
(3)如果catch子句捕获了异 常,s4会执行吗?说明一下理由?
作者: peerless2012    时间: 2013-6-17 19:59
1   s3不会执行,运行到s2出现异常之后,就跳到catch语句中(因为你写异常了,虽然是空,但是也算捕获异常),s4执行
2 如果不捕获异常,而是抛出的话,s4不会执行
3 捕获异常后,s4执行

作者: peerless2012    时间: 2013-6-17 20:00
我简单用代码试了一下,实验代码在这里,楼主看一下
  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. }
复制代码

作者: 杨增坤    时间: 2013-6-17 20:13
当没有捕获到异常的话 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)

希望能对你有帮助

作者: 刘利民    时间: 2013-6-17 20:33
      先回答笔者第一个问题:当try程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的catch程序块,catch程序块里面的语句被执行。
当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句。try块中没有抛出异常,所以try中的语句都会执行,当然也包括了s3.
第二个问题:如果异常未被捕获,那么整个程序就是正常的S4当然会执行。同第三个问题
第三个问题:因为没有finally块(且块中有关闭资源的语句),所以不管catch子句有没有捕获到异常,都会执行S4.
作者: 姚志远    时间: 2013-6-17 20:33
最后一个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也就执行到了。
作者: 刘利民    时间: 2013-6-17 20:36
forward 发表于 2013-6-17 20:13
当没有捕获到异常的话 s4不会执行  当捕获到了异常的话  s4会执行  但是s3不会执行

原因是:

我学得S3会执行,当执行S2语句时发生异常,那么就会把异常抛给下面的catch子句进行处理,处理完后,会跳转到S3,正常语句,这样才会使整个程序执行正常。
作者: 孔雀东南飞    时间: 2013-6-17 20:49

  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>
复制代码

作者: 孙百鑫    时间: 2013-6-22 01:53
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2