黑马程序员技术交流社区

标题: 异常 [打印本页]

作者: 吴通    时间: 2012-9-4 09:03
标题: 异常
第一种:
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的语句不是两种情况下都执行不到吗?

作者: 邓超军    时间: 2012-9-4 09:17
第一种情况中System.out.println("A");紧随throw new Exception();后面,称为垃圾语句,是不能编译通过的。而第二种是通过调用函数而达到第一种效果,但是并没有产生垃圾语句,所以第二种可以编译通过。
作者: 杨卓儒    时间: 2012-9-4 10:07
邓超军 发表于 2012-9-4 09:17
第一种情况中System.out.println("A");紧随throw new Exception();后面,称为垃圾语句,是不能编译通过的。 ...

垃圾语句 是怎么判定的? 有没有相关资料啊,网上搜不到。
作者: 黑马--张帅    时间: 2012-9-4 10:32
第一中情况中在func中抛出了错误,由于throw有结束程序的功能,所以后面的语句执行不到成为垃圾语句,所以编译失败
第二情况中由于func抛出的异常被单独封装在一个函数体中完全不影响调用处函数的继续执行,所以这种情况可以编译通过执行出结果。
作者: 焦晨光    时间: 2012-9-4 10:58
其实,楼上的已经说的很清楚了
第一种情况:
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"); 语句均得不到执行!

作者: 吴通    时间: 2012-9-5 20:29
已解决 谢谢
作者: 乔九    时间: 2012-9-5 21:49
因为第一个的System.out.println("A");执行不到所以会报错。而第二个声明了声明了异常也就是说并不一定会执行




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