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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李阳阳 中级黑马   /  2013-3-19 17:29  /  2431 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李阳阳 于 2013-3-19 20:46 编辑

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

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

未命sa名.jpg

评分

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

查看全部评分

11 个回复

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

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

所以总结果是:
B
D
回复 使用道具 举报
因为这个func函数执行到throw 语句后肯定会跳转到catch语句,所以throw下面的语句永远执行不到,所以throw语句下面的代码都没用。
回复 使用道具 举报
func()里面直接try catch,自己解决问题了,并没有抛出新的异常,所以func方法不用抛出异常,主函数也是。不过这题因为打印A的那句话无法执行到,因为throw new Exception()后就直接被catch了,打印a的语句无法执行到的话编译器不会让你编译通过的。
回复 使用道具 举报
首先你的问题有以下几点:
1、try代码块里面即使不抛出异常,也是可以处理的,因为try要处理的是【可能】抛出异常的代码。
2、把System.out.println("A");注释掉之后,代码可以正常运行,结果是BD
回复 使用道具 举报
你的一下代码是不能通过编译的:
  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语句。
      
回复 使用道具 举报
这段代码肯定编译错误,try   catch  是
try{
     可能出现异常的代码,进行捕获
}
catch(){
     抓到try捕获的异常进行处理
}

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

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

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

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

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

为什么A打印不出来,它就编译失败啦?
回复 使用道具 举报
本帖最后由 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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马