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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何超 中级黑马   /  2013-11-6 18:16  /  1866 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何超 于 2013-11-7 20:11 编辑
  1. <div class="blockcode"><blockquote>class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 try
  6.                 {
  7.                         showExce();                  
  8.                 }
  9.                 catch(Exception e)
  10.                 {
  11.                         System.out.println("B");
  12.                 }
  13.                 System.out.println("D");
  14.         }
  15.         public static void showExce()
  16.         {
  17.                 try
  18.                 {
  19.                         throw new Exception();       ①
复制代码
视频里说的是编译失败,因为这里直接抛出异常。但是紧跟的后面不是catch么 这里不是相当于在函数内部直接处理掉了一场么

并且下一个代码里的同样是这样的问题却可以运行   所以我很疑惑
  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. }
复制代码
①和②都是在函数内部抛出了异常 然后后面紧跟着一个catch  为什么①不能运行 ②能运行!!!

评分

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

查看全部评分

11 个回复

倒序浏览
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 try
  6.                 {
  7.                         showExce();                  
  8.                 }
  9.                 catch(Exception e)
  10.                 {
  11.                         System.out.println("B");
  12.                 }
  13.                 System.out.println("D");
  14.         }
  15.         public static void showExce()
  16.         {
  17.                 try
  18.                 {
  19.                         throw new Exception();                  
  20.                         System.out.println("A");
  21.                 }
  22.                 catch(Exception e)
  23.                 {
  24.                         System.out.println("B");
  25.                 }
  26.         }
  27. }
复制代码
第一个的代码  刚才不知道为什么没粘贴完整!!!
回复 使用道具 举报
是你20行的问题,编译器认为,这一句是执行不到19行是不是throw new Exception(); ,这么一来程序就跳转到catch里面去处理了,下面的sop怎么会执行到呢,编译器肯定不让你过,就相当于在return或是break后面还有执行语句,这样显然是不合乎逻辑的。
当然第二个为什么可以编译通过,并正确执行,那就先得很简单了,if()是一种可能性假设吧,下面自然是可以有可能执行到的,逻辑OK吧。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
黄炳期 发表于 2013-11-7 08:59
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89 ...

....为什么我照着连接的那个网页里的操作  但是在我的回复按钮旁边没有编辑  从左往右是  点评 回复  支持 反对···就是没看到编辑
回复 使用道具 举报
何超 发表于 2013-11-7 09:07
....为什么我照着连接的那个网页里的操作  但是在我的回复按钮旁边没有编辑  从左往右是  点评 回复  支 ...

不是在回复里修改。直接在帖子内容下面可以找到~
问题解决了么
回复 使用道具 举报
何超 中级黑马 2013-11-7 15:28:36
7#
本帖最后由 何超 于 2013-11-7 18:44 编辑
李慧声 发表于 2013-11-7 01:33
是你20行的问题,编译器认为,这一句是执行不到,19行是不是throw new Exception(); ,这么一来程序就跳转 ...
...
  1. try
  2.                 {
  3.                         throw new Exception();          //直接抛出但是我觉得不是应该被catch捕获么     
  4.                         System.out.println("A");            既然被catch捕获了 为什么不能运行catch里面的语句
  5.                 }                                                    反而是编译失败呢  syo不运行我可以理解 就是不理解   
  6.                 catch(Exception e)                           为什么try里抛出之后应该被catch捕获然后运行catch里
  7.                 {                                                    的语句  但是程序却编译出错   第二个程序却编译通过
  8.                         System.out.println("B");
  9.                 }
复制代码
回复 使用道具 举报
何超 中级黑马 2013-11-7 15:31:40
8#
李慧声 发表于 2013-11-7 01:33
是你20行的问题,编译器认为,这一句是执行不到,19行是不是throw new Exception(); ,这么一来程序就跳转 ...

直接抛出但是我觉得不是应该被catch捕获么     既然被catch捕获了 为什么不能运行catch里面的语句
反而是编译失败呢  syo不运行我可以理解
就是不理解   为什么try里抛出之后应该被catch捕获然后运行catch里的语句  (你也说了try抛出之后是运行catch里的语句了啊)
但是程序却编译出错 同样的情况另一个程序缺编译通过 另一个程序却编译通过
回复 使用道具 举报
何超 中级黑马 2013-11-7 15:32:30
9#
黄炳期 发表于 2013-11-7 11:06
不是在回复里修改。直接在帖子内容下面可以找到~
问题解决了么

还没呢···好了我会把帖子分类的!!!!!:D
回复 使用道具 举报
本帖最后由 李慧声 于 2013-11-7 15:52 编辑
何超 发表于 2013-11-7 15:31
直接抛出但是我觉得不是应该被catch捕获么     既然被catch捕获了 为什么不能运行catch里面的语句
反而是 ...

怎么执行不到啊,捕获了,肯定走catch了,你把
throw new Exception();                  
  System.out.println("A");
中下面一句注释了,编译走走看能不能走到B。
这段代码的问题出现在哪里,前面的回复已经说清楚,是一个逻辑问题。
举个简单例子,一个函数被return返回了,你觉得在这个函数内部,return下面再写其他的执行语句有意义吗,jvm能执行得到嘛,编译器检查的是语法错误,既然编不过,那就想想哪里语法有错误了,而不是执行不执行的问题。
举个再猥琐的例子吧,一段程序好比一个人,程序拘束好比人生结束,你说程序throw异常是不是相当于人bug了,你让人bug了,还去做一些事事,现在就是说不是该怎么做的事了,而是能不能做的事了,你觉得这符合逻辑不?
好好研究一下两个程序,对问题的处理思路是严重不同的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
李慧声 发表于 2013-11-7 01:33
是你20行的问题,编译器认为,这一句是执行不到,19行是不是throw new Exception(); ,这么一来程序就跳转 ...

总算懂了  谢谢你啊  原来还是逻辑的问题  我一直去考虑到catch是不是没捕获到那个异常去了   考虑的方向没有到问题的本质····
回复 使用道具 举报
何超 发表于 2013-11-7 18:10
总算懂了  谢谢你啊  原来还是逻辑的问题  我一直去考虑到catch是不是没捕获到那个异常去了   考虑的方向 ...

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