黑马程序员技术交流社区

标题: 关于异常try--catch的问题 [打印本页]

作者: 李阳阳    时间: 2013-3-19 17:29
标题: 关于异常try--catch的问题
本帖最后由 李阳阳 于 2013-3-19 20:46 编辑

   这是视频中关于异常的练习题,我一开始看的时候也是认为结果是编译失败,但是我理解的是“因为func ( )方法上没有
声明异常,而主函数却处理了”所以编译失败了。
     毕老师说的是主函数调用 func ( ) 后, 它里面抛出异常,“A”打印的语句执行不到所以编译不通过。但是按这个思路我又
认为它能编译通过了{:soso_e101:},我认为是func()运行的时候,try里面抛出异常了,但它不是在内部处理了吗,所以该打印“B”啊?
处理之后主函数里面try的部分不就能执行了?但是又没结果。然后不还有个“D”的吗?搞不明白了,大家给捋捋我是那个知识
点记错了,然后try--catch在没有声明异常的情况下也能用吗?谢谢大家!!

未命sa名.jpg (49.89 KB, 下载次数: 85)

未命sa名.jpg

作者: 沉默de羔羊    时间: 2013-3-19 17:48
下次可以了不要截图,把源码贴出来!
在func方法里面:
首先在try{}里面通过throw 抛出了Exception异常(表明我这里出问题了,你就要进行问题处理!),就不会再执行下面的Sysytem.out.println("A")(我一直很好奇,这里你能编译通过么?);
那么就会直接进入catch里面匹配异常,然后执行catch里面的内容。

而在mian函数里面:
在try{}里面执行func方法的时候,已经进行了内部处理,打印结果是“B”,所以就没有错误抛出,然后进顺利执行程序,再次打印“D”.

所以总结果是:
B
D
作者: 寇弘禄    时间: 2013-3-19 17:55
因为这个func函数执行到throw 语句后肯定会跳转到catch语句,所以throw下面的语句永远执行不到,所以throw语句下面的代码都没用。
作者: blackcaismine    时间: 2013-3-19 17:55
func()里面直接try catch,自己解决问题了,并没有抛出新的异常,所以func方法不用抛出异常,主函数也是。不过这题因为打印A的那句话无法执行到,因为throw new Exception()后就直接被catch了,打印a的语句无法执行到的话编译器不会让你编译通过的。
作者: 张亚青    时间: 2013-3-19 18:04
首先你的问题有以下几点:
1、try代码块里面即使不抛出异常,也是可以处理的,因为try要处理的是【可能】抛出异常的代码。
2、把System.out.println("A");注释掉之后,代码可以正常运行,结果是BD
作者: _王涛    时间: 2013-3-19 18:23
你的一下代码是不能通过编译的:
  1. try {
  2. throw new Exception();
  3. System.out.println("A");
  4. } catch (Exception e) {
  5. // TODO Auto-generated catch block
  6. System.out.println("B");
  7. }
复制代码
因为throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。
      
作者: 安鹏宇    时间: 2013-3-19 19:24
这段代码肯定编译错误,try   catch  是
try{
     可能出现异常的代码,进行捕获
}
catch(){
     抓到try捕获的异常进行处理
}

你在别的地方抛异常,在这里进行捕获可以内部处理,但是你在try内部抛出一个异常
throw下面的语句就永远执行不到,,如果你把A语句注释掉,会打印catch里面的语句

主函数里,你对func()进行捕获,在func()方法中它已经自己处理过了,所以这里
没有异常,catch语句不执行,再继续执行D

所以有A语句编译错误,如果你把A注释掉,编译肯定是 BD


作者: 王薪婷    时间: 2013-3-20 20:02
我的理解是:并不是说函数上不要声明异常,上面那个func函数他的里面有catch语句了呀,如果问题在函数内部就被解决了外面不知道了就可以不用throws声明了,对于这个声明反正要记住一点,如果函数里面没有catch,又是编译时被检测的异常,那么必须得声明的。这个编译通不过是因为那句打印A永远的执行不到,可能这在java中是不允许的,如果执行不到就不要写,如果写了那就要保证它有可能被执行到才行
作者: 李阳阳    时间: 2013-3-20 20:33
王薪婷 发表于 2013-3-20 20:02
我的理解是:并不是说函数上不要声明异常,上面那个func函数他的里面有catch语句了呀,如果问题在函数内部 ...

其实我就是没转过来,为什么A打印不出来,它就编译失败了?
作者: 王薪婷    时间: 2013-3-21 12:49
{:soso_e110:}额恩恩,这个毕老师说编译失败的时候我就没有想那么多,我只想着那条打印A的语句是不可能被执行的,所以编译失败。。
作者: 李阳阳    时间: 2013-3-21 13:14
张亚青 发表于 2013-3-19 18:04
首先你的问题有以下几点:
1、try代码块里面即使不抛出异常,也是可以处理的,因为try要处理的是【可能】抛 ...

为什么A打印不出来,它就编译失败啦?
作者: qintoko    时间: 2013-3-21 13:20
本帖最后由 qintoko 于 2013-3-21 13:27 编辑
  1. public class Heima {
  2.         public static void func(){
  3.                 try {
  4.                         throw new Exception();
  5.                 } catch (Exception e) {
  6.                         System.out.println("B");
  7.                        //System.out.println("A"); [/backcolor]
  8.                 }
  9.         }
  10.         public static void main(String[] args) {
  11.                 try {
  12.                         func();//异常已经处理,所以不会打印C;在处理异常时,还没执行A,所以要去掉
  13.                 } catch (Exception e) {
  14.                         System.out.println("C");
  15.                 }
  16.                 System.out.println("D");
  17.         }
  18. }
复制代码
最后的结果是B,D




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