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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈红建 中级黑马   /  2012-8-1 18:04  /  1716 人查看  /  4 人回复  /   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 神马都是浮云

查看全部评分

4 个回复

倒序浏览
(1)S3 不会执行,因为虚拟机抛出第一个异常的时候程序就停止了
(2)如果异常没有被捕获S4不会被执行。程序就停止了,是执行不到S4的。
(3)如果异常被捕获了,可以执行S4。

楼主看看下面这个例子

class Test {
  

        public static void main(String[] args)
        {
                System.out.println("程序开始");
                try {
                                System.out.println(10/0);
                        } catch(ArithmeticException e1) {
                                System.out.println("程序异常1");
                }
                try {
                        int[] arr = null;
                                System.out.println(arr[0]);
                        } catch(NullPointerException e2) {
                                System.out.println("程序异常2");       
                }
                System.out.println("程序结束");               
        }


       
}


(1)异常都捕获了

程序开始
程序异常1
程序异常2
程序结束                 //异常捕获了是可以执行的S4的。
(2)异常未捕获
程序开始
Exception in thread "main" java.lang.ArithmeticException: / by zero               //异常未捕获的时候,只能执行S1,碰到S2有抛出异常,程序就退出了,后面就都不执行了
        at Test.main(Test.java:8)
(3)

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
try-catch的作用时让程序产生异常的时候不会终止,继续执行下去,无论是否有异常,try-catch过后程序会继续执行s4,一旦try中有表达式抛出异常,则try中剩余的表达式不执行,跳到catch块中执行代码,然后继续执行try-catch后的代码(也就是s4)
回复 使用道具 举报
设下列try-catch语句块中的第二个语句s2将引起一个异常,则回答下列问题:
try{ s1; s2; s3; }
catch(ExceptionType e1){}
catch(ExceptionType e2){}
s4;
(1)s3会执 行吗
不会
因为通常情况try块被执行一次,只有一个catch快会被执行,除非循环中使用了continue开始下一次循环,这才可能导致多个catch块被执行.
也就是说s2抛出异常,本次try块就结束了,跳到catch块来处理异常,s3就没有机会执行

(2)如果异常未被捕获,s4会被执行吗?
不会
因为try块代码出现异常时,系统自动生成一个异常对象,会寻找能处理该异常的catch块,找不到则运行时环境终止,程序退出,就没机会执行后面的s4
(3)如果catch子句捕获了异 常,s4会执行吗?说明一下理由?

因为完成了一个抛出捕获异常的过程,当然会继续正常执行后面的程序
回复 使用道具 举报
  1. public class Test20 {
  2.         public static String output="";
  3.         public static void foo (int i)
  4.         {
  5.                 try
  6.                 {
  7.                         if (i==1)
  8.                                 throw new Exception();//这相当与s2;
  9.                         output+="1";//这相当与s3;
  10.                 }
  11.                 catch(Exception e)
  12.                 {
  13.                         output+="2";
  14.                 }
  15.                 output+="3";//此处是捕获异常情况下的s4;
  16.         }
  17.         public static void main(String[] args) {
  18.                 // TODO Auto-generated method stub
  19.                 foo(1);
  20.                 System.out.println(output);
  21.                 Demo d=new Demo();
  22.                 int x=d.div(4, 0);
  23.                 System.out.println(x);//这相当与没有捕获异常的s4;
  24.         }

  25. }
  26. class Demo       
  27. {
  28.         int div(int a,int b)//throws ArithmeticException,ArrayIndexOutOfBoundsException,FushuException
  29.         {
  30.                 if (b<0) {
  31.                         throw new FushuException("出现了负数的情况",b);
  32.                 }
  33.                 if (b==0) {
  34.                         throw new ArithmeticException("被零除了!!");//数学异样为RuntimeException的子类。
  35.                 }
  36.                 //int[] arr=new int[4];
  37.                 //System.out.println(arr[3]);
  38.                 return a/b;
  39.         }
  40. }
复制代码
以上代码是我执行过的代码。结果为
Exception in thread "main" java.lang.ArithmeticException: 被零除了!!
        at day9.Demo.div(ExceptionDemo.java:41)
        at day9.Test20.main(Test20.java:24)
23
可见:(1)s3不会执行。
(2)如果异常未被捕获,程序会报错,s4不会被执行。
(3)如果catch子句捕获了异常,s4会执行。
如果异常是编译时可检测异常,如果没有处理(没有抛出,也没有处理),便以失败。
如果处理了,那么就执行下面的语句。
如果是编译时不可检测的异常,如果出现此异常,程序停止。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马