当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

重新"掷"出违例[Java编程]

赞助商链接



  本文“重新"掷"出违例[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在某些情形下,我们想重新掷出方才产生过的违例,分外是在用Exception捕捉全部大概的违例时.由于我们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄便可.下面是一个例子:
catch(Exception e) {
System.out.println("一个违例已经产生");
throw e;
}
重新“掷”出一个违例招致违例进入更高一级环境的违例掌握器中.用于同一个try块的任何更进一步的catch从句仍旧会被忽视.此外,与违例对象有关的全部东西城市得到保存,所以用于捕捉特定违例范例的更高一级的掌握器可以从那个对象里提取出全部信息.
若只是简单地重新掷出当前违例,我们打印出来的、与printStackTrace()内的那个违例有关的信息会与违例的发源地对应,而不是与重新掷出它的地址对应.若想安装新的仓库跟踪信息,可调用fillInStackTrace(),它会返回一个特别的违例对象.这个违例的成立历程以下:将当前仓库的信息填充到本来的违例对象里.下面列出它的情势:
//: Rethrowing.java
// Demonstrating fillInStackTrace()

public class Rethrowing {
  public static void f() throws Exception {
    System.out.println(
      "originating the exception in f()");
    throw new Exception("thrown from f()");
  }
  public static void g() throws Throwable {
    try {
      f();
    } catch(Exception e) {
      System.out.println(
        "Inside g(), e.printStackTrace()");
      e.printStackTrace();
      throw e; // 17
      // throw e.fillInStackTrace(); // 18
    }
  }
  public static void
  main(String[] args) throws Throwable {
    try {
      g();
    } catch(Exception e) {
      System.out.println(
        "Caught in main, e.printStackTrace()");
      e.printStackTrace();
    }
  }
} ///:~

此中最重要的行号在注释内标志出来.注意第17行没有设为注释行.它的输出后果以下:
originating the exception in f()
Inside g(), e.printStackTrace()
java.lang.Exception: thrown from f()
        at Rethrowing.f(Rethrowing.java:8)
        at Rethrowing.g(Rethrowing.java:12)
        at Rethrowing.main(Rethrowing.java:24)
Caught in main, e.printStackTrace()
java.lang.Exception: thrown from f()
        at Rethrowing.f(Rethrowing.java:8)
        at Rethrowing.g(Rethrowing.java:12)
        at Rethrowing.main(Rethrowing.java:24)

因此,违例仓库途径无论若何城市记着它的真正起点,无论自己被反复“掷”了好几次.
若将第17行标注(变成注释行),而撤消对第18行的标注,就会换用fillInStackTrace(),后果以下:
originating the exception in f()
Inside g(), e.printStackTrace()
java.lang.Exception: thrown from f()
        at Rethrowing.f(Rethrowing.java:8)
        at Rethrowing.g(Rethrowing.java:12)
        at Rethrowing.main(Rethrowing.java:24)
Caught in main, e.printStackTrace()
java.lang.Exception: thrown from f()
        at Rethrowing.g(Rethrowing.java:18)
        at Rethrowing.main(Rethrowing.java:24)

由于利用的是fillInStackTrace(),第18行成为违例的新起点.
针对g()和main(),Throwable类必须在违例规格中呈现,因为fillInStackTrace()会生成一个Throwable对象的句柄.由于Throwable是Exception的一个底子类,所以有大概得到一个可以“掷”出的对象(具有Throwable属性),但却并非一个Exception(违例).因此,在main()顶用于Exception的句柄大概丧失自己的目标.为保证全部东西均井井有条,编译器强迫Throwable利用一个违例标准.举个例子来说,下述程序的违例便不会在main()中被捕捉到:
//: ThrowOut.java
public class ThrowOut {
  public static void
  main(String[] args) throws Throwable {
    try {
      throw new Throwable(); 
    } catch(Exception e) {
      System.out.println("Caught in main()");
    }
  }
} ///:~

也有大概从一个已经捕捉的违例重新“掷”出一个差别的违例.但假定这样做,会得到与利用fillInStackTrace()近似的效果:与违例发源地有关的信息会全部丧失,我们留下的是与新的throw有关的信息.以下所示:
//: RethrowNew.java
// Rethrow a different object from the one that
// was caught

public class RethrowNew {
  public static void f() throws Exception {
    System.out.println(
      "originating the exception in f()");
    throw new Exception("thrown from f()");
  }
  public static void main(String[] args) {
    try {
      f();
    } catch(Exception e) {
      System.out.println(
        "Caught in main, e.printStackTrace()");
      e.printStackTrace();
      throw new NullPointerException("from main");
    }
  }
} ///:~

输出以下:
originating the exception in f()
Caught in main, e.printStackTrace()
java.lang.Exception: thrown from f()
        at RethrowNew.f(RethrowNew.java:8)
        at RethrowNew.main(RethrowNew.java:13)
java.lang.NullPointerException: from main
        at RethrowNew.main(RethrowNew.java:18)

最后一个违例只知道自己来自main(),而非来自f().注意Throwable在任何违例标准中都不是必须的.
永久没必要关心若何排除前一个违例,大概与之有关的其他任何违例.它们都属于用new成立的、以内存堆为底子的对象,所以垃圾汇集器会自动将其排除.
  以上是“重新"掷"出违例[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: 与您的QQ/BBS好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .