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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈国斌 中级黑马   /  2013-5-4 21:15  /  1892 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

我记得毕老师讲过:throw单独存在时,下边不要定义语句,因为执行不到,在有些情况下throw下边能定义语句,就像这个代码里边的情况(我加注释的地方)。
请问一下,具体怎么区分啊?谢谢了!
  1. class Test
  2. {
  3.         public static String output="";
  4.         public static void foo(int i)
  5.         {
  6.                 try
  7.                 {
  8.                         if(i==1)
  9.                                 throw new Exception();
  10.                         output+="1";//就是这里
  11.                 }
  12.                 catch(Exception e)
  13.                 {
  14.                         output+="2";
  15.                         return;
  16.                 }
  17.                 finally
  18.                 {
  19.                         output+="3";
  20.                 }
  21.                 output+="4";
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                 foo(0);
  26.                 System.out.println(output);
  27.                 foo(1);
  28.                 System.out.println(output);
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
我的理解
  1. if(i==1)
  2.                                 throw new Exception();
  3.                         output+="1";//就是这里
复制代码
throw在if语句中是最后一句了,它的下面没有可以执行的语句
而 output+="1"; 是可以执行得到的语句
如果如果
if(i==1){
                        throw new Exception();
                        output+="1";//就是这里
}
这样写就不行了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
高新星 发表于 2013-5-4 21:30
我的理解throw在if语句中是最后一句了,它的下面没有可以执行的语句
而 output+="1"; 是可以执行得到的语句 ...

毕老师不是说函数内声明了函数上不是也要用throws声明吗,为什么这么没声明还没错误呢?
回复 使用道具 举报
罗广伟 发表于 2013-5-4 21:42
毕老师不是说函数内声明了函数上不是也要用throws声明吗,为什么这么没声明还没错误呢? ...

楼主的代码中已经用try{}catch(){}finally{}进行捕获处理了

异常的两种处理方式:try或者throws
回复 使用道具 举报
高新星 发表于 2013-5-4 22:09
楼主的代码中已经用try{}catch(){}finally{}进行捕获处理了

异常的两种处理方式:try或者throws

明白了,多谢!
回复 使用道具 举报
因为在throw new Exception() 之前会进行if判断,这样就存在有可能判断为假不抛异常的情况,这样下面的output+="1"是有意义的。

我认为在同一个代码块里在throw 语句下面定义其他语句是没有意义的。 执行到throw时程序就改变了原有的执行路径,那下面的语句就执行不到了。

就像 return一样.
你可以这样写
  1. if(i==1){
  2.                         return;                       
  3.                 }
  4.                 System.out.println("...");
复制代码
不能这样写
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i = 1;
  6.                 if(i==1){
  7.                         return;
  8.                         System.out.println("...");//执行不到
  9.                 }               
  10.         }
  11. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我记得有一个异常练习的第16题就是这方面的。当时纠结了好一段时间还发了个贴子问了大家,但是还是
没明白,现在慢慢的转过这个弯儿了,估计咱俩纠结在一个地方,我就说一下我自己的理解希望对你有帮助。
说throw单独存在时,下面不能有语句,因为执行不到。记着是单独存在时执行不到。我们来对比下:

    try
        {
                throw  new Exception();//4.throw单独存在时不就是肯定会抛异常吗
                System.out.println("A");//5.既然肯定抛异常,那一抛就try了,这句肯定执行不到的啊那写了有什么用呢

                //1.上面那两句就相当于毕老师举得那个除数的例子

                div(a,b);//2.这句话有可能会抛异常,抛了的话就进行try处理,不抛就打印下面的值
                        System.out.println("A");//3.所以说下面这句是有可能执行到的
        }       

而下面这段代码的意思是:
        try
    {
                if(i==1)//如果满足条件就抛异常然后就try catch处理了
                        throw new Exception();

        output+="1";//如果i不等于1就执行这句啦,所以这句是有可能执行到的,就像楼上说的return

    }

另外 你记着throw new Exception()就相当于a/b时b等于零的情况,都出异常了下面的肯定是执行不到的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马