黑马程序员技术交流社区

标题: 异常在编译时的问题。。。。。 [打印本页]

作者: 黑马任雪刚    时间: 2012-6-25 15:25
标题: 异常在编译时的问题。。。。。
本帖最后由 黑马任雪刚 于 2012-6-27 09:30 编辑

//下面这两组代码为什么一个编译通过,一个编译失败呢???????
class Demo
{
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");
}
public static void showExce()throws Exception
{
  throw new Exception();
}
}//编译成功


class Demo
{
public static void func()
{
  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");
}
}//编译失败

作者: 李天甲    时间: 2012-6-25 15:42
第二段:
throw  new Exception();
    System.out.println("A");//代码放在了抛出异常语句的下面,所以出现了错误。这一句是铁定执行不到的.
语法上面规定抛出错误后不能执行下面的东西了
第一段:
showExce();
System.out.println("A");上一句不是抛出错误呵呵
public static void showExce()throws Exception
{
   throw new Exception();
   //你要是写在这里一样报错
}
第一段抛出错误后没有执行东西呵呵
作者: 谭立文    时间: 2012-6-25 15:48
第一个当你调用
public static void showExce()throws Exception;这个方法在编译器看来它只是申明了有可能会抛异常,虽然你写的代码是一定有抛异常的,当在编译器看来该方法只是可能会抛异常,至于抛不抛在编译阶段还不能得出结果只有等到程序运行才能确定最后是否抛异常,所以你在调用该方法的下面写代码是可以编译通过的。
而第二个例子,你指直接在try里面写了throw  new Exception();在编译时就确定了当代码执行到这里时一定是会抛异常的,所以其后面的代码将不会被执行,所以写了也是白写,此时编译将不能通过,主要是提示你后面的代码将不会被执行,避免在程序运行中出现错误。

作者: 张华廷    时间: 2012-6-25 16:19
class Demo
{
public static void func()
{
  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 func()
{
  try
  {
          System.out.println("A");
   throw  new Exception();
  
  }
  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");
}
}

作者: 黄连兵    时间: 2012-6-25 16:21
showExce(); 是个方法,此方法可能会抛出异常,但是编译器并不知道是否一定会出现异常,那就是说后面的代码还是有可能执行得到的。
throw  new Exception();直接抛出异常,后面的代码都没有机会执行了。
毕老师的视频里好像有说过这个问题吧~!
作者: 周兴中    时间: 2012-6-25 16:38
showExce();
   System.out.println("A");//这句并没有放在抛出异常的语句下面,而是放在一个有可能抛出异常的语句下面,可以编译通过

throw  new Exception();// 而这句是必然抛出异常.
   System.out.println("A");//所以这句对于编译器来说是:Unreachable code 必然读不到的语句,所以编译不通过.
作者: 余清兰    时间: 2012-6-25 17:12
class Demo
{
public static void func()
{
  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");
}
}//编译失败
这个编译失败是因为当执行到try块里的语句时,直接抛出了异常,接着就跳转到了catch块中处理问题,所以下面的代码就执行不到,编译时就会报错。
注意:throw单独存在时,下面不要定义语句,因为执行不到,它会直接抛出问题,跳转到catch块中处理问题。
作者: 孙飞    时间: 2012-6-25 19:46
第一个代码正常,所以编译成功,第二个代码你手动抛出了异常,抛出异常后后面的代码就不会执行了,并不是你那个代码放在抛出异常下面导致的,就算你放上面,它执行到抛出异常后还会停止程序,而且你手动抛出异常应该在函数上声明的
作者: 游洪波    时间: 2012-6-25 19:57
本帖最后由 游洪波 于 2012-6-25 20:20 编辑

//下面这两组代码为什么一个编译通过,一个编译失败呢???????
class Demo
{
public static void main(String[] args)
{
  try
  {
   showExce(); //这个方法有可能抛出一个异常,你用了try{}catch{}去捕获他们,所以下边的代码编译肯定是会通过了。
   System.out.println("A");//  }
  catch(Exception e)
  {
   System.out.println("B");
  }
  finally
  {
   System.out.println("C");
  }
  System.out.println("D");
}
public static void showExce()throws Exception
{
  throw new Exception();
}
}//编译成功


class Demo
{
public static void func()
{
  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");
}
-----------------------------------、
求个分吧
作者: 黑马-王言龙    时间: 2012-6-25 20:26
本帖最后由 wyl530274554 于 2012-6-25 20:29 编辑
复制代码





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