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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-9-4 09:03  /  1619 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一种:
class Demo
{
public static void fun()
{
  try
  {
   throw new Exception();
   System.out.println("A");
  }
  catch (Exception e)
  {
   System.out.println("B");
  }
}
public static void main(String[] args)
{
  try
  {
   func();
  }
  catch (Exception e)
  {
   System.out.println("C");
  }
  System.out.println("D");
}
}
第二种:
class Demo
{
public static void showExce()throws Exception
{
  throw new Exception();
}
public static void main(String[] args)
{
  try
  {
   showExce();
   System.out.println("A");
  }
  catch (Exception e)
  {
   System.out.println("B");
  }
  finally
  {
   System.out.println("C");
  }
  System.out.println("D");
}
}
为什么第一种编译失败,第二种能够通过,打印A的语句不是两种情况下都执行不到吗?

6 个回复

倒序浏览
第一种情况中System.out.println("A");紧随throw new Exception();后面,称为垃圾语句,是不能编译通过的。而第二种是通过调用函数而达到第一种效果,但是并没有产生垃圾语句,所以第二种可以编译通过。
回复 使用道具 举报
邓超军 发表于 2012-9-4 09:17
第一种情况中System.out.println("A");紧随throw new Exception();后面,称为垃圾语句,是不能编译通过的。 ...

垃圾语句 是怎么判定的? 有没有相关资料啊,网上搜不到。
回复 使用道具 举报
第一中情况中在func中抛出了错误,由于throw有结束程序的功能,所以后面的语句执行不到成为垃圾语句,所以编译失败
第二情况中由于func抛出的异常被单独封装在一个函数体中完全不影响调用处函数的继续执行,所以这种情况可以编译通过执行出结果。
回复 使用道具 举报
其实,楼上的已经说的很清楚了
第一种情况:
throw new Exception();
   System.out.println("A");
在这种情况下 System.out.println("A");语句是一定执行不到的
jvm在编译的时候会发现这个问题,会报错提醒,所以编译不能通过

第二种情况:
showExce();
   System.out.println("A");
抛出异常的动作被封装成了一个方法,这样java虚拟机在编译的时候,会认为
System.out.println("A");语句的上一个语句是一个正常方法,
所以后面的语句有可能会被执行,所以编译正常,可以通过。

毕老师在视频里有详细的解释
以上两种情况,实际上 System.out.println("A"); 语句均得不到执行!
回复 使用道具 举报
已解决 谢谢
回复 使用道具 举报
因为第一个的System.out.println("A");执行不到所以会报错。而第二个声明了声明了异常也就是说并不一定会执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马