麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

重新“擲”出違例

2019-11-18 13:19:40
字體:
供稿:網(wǎng)友

  在某些情況下,我們想重新擲出剛才產(chǎn)生過的違例,非凡是在用Exception捕捉所有可能的違例時(shí)。由于我們已擁有當(dāng)前違例的句柄,所以只需簡(jiǎn)單地重新擲出那個(gè)句柄即可。下面是一個(gè)例子:
  catch(Exception e) {
  System.out.  throw e;
  }
  重新“擲”出一個(gè)違例導(dǎo)致違例進(jìn)入更高一級(jí)環(huán)境的違例控制器中。用于同一個(gè)try塊的任何更進(jìn)一步的catch從句仍然會(huì)被忽略。此外,與違例對(duì)象有關(guān)的所有東西都會(huì)得到保留,所以用于捕捉特定違例類型的更高一級(jí)的控制器可以從那個(gè)對(duì)象里提取出所有信息。
  若只是簡(jiǎn)單地重新擲出當(dāng)前違例,我們打印出來的、與printStackTrace()內(nèi)的那個(gè)違例有關(guān)的信息會(huì)與違例的起源地對(duì)應(yīng),而不是與重新擲出它的地點(diǎn)對(duì)應(yīng)。若想安裝新的堆棧跟蹤信息,可調(diào)用fillInStackTrace(),它會(huì)返回一個(gè)非凡的違例對(duì)象。這個(gè)違例的創(chuàng)建過程如下:將當(dāng)前堆棧的信息填充到原來的違例對(duì)象里。下面列出它的形式:
  
  //: 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();
    }
   }
  } ///:~
  
  其中最重要的行號(hào)在注釋內(nèi)標(biāo)記出來。注重第17行沒有設(shè)為注釋行。它的輸出結(jié)果如下:
  
  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)
  
  因此,違例堆棧路徑無論如何都會(huì)記住它的真正起點(diǎn),無論自己被重復(fù)“擲”了好幾次。
  若將第17行標(biāo)注(變成注釋行),而撤消對(duì)第18行的標(biāo)注,就會(huì)換用fillInStackTrace(),結(jié)果如下:
  
  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行成為違例的新起點(diǎn)。
  針對(duì)g()和main(),Throwable類必須在違例規(guī)格中出現(xiàn),因?yàn)閒illInStackTrace()會(huì)生成一個(gè)Throwable對(duì)象的句柄。由于Throwable是Exception的一個(gè)基礎(chǔ)類,所以有可能獲得一個(gè)能夠“擲”出的對(duì)象(具有Throwable屬性),但卻并非一個(gè)Exception(違例)。因此,在main()中用于Exception的句柄可能丟失自己的目標(biāo)。為保證所有東西均井然有序,編譯器強(qiáng)制Throwable使用一個(gè)違例規(guī)范。舉個(gè)例子來說,下述程序的違例便不會(huì)在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()");
    }
   }
  } ///:~
  
  也有可能從一個(gè)已經(jīng)捕捉的違例重新“擲”出一個(gè)不同的違例。但假如這樣做,會(huì)得到與使用fillInStackTrace()類似的效果:與違例起源地有關(guān)的信息會(huì)全部丟失,我們留下的是與新的throw有關(guān)的信息。如下所示:
  
  //: 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)
  
  最后一個(gè)違例只知道自己來自main(),而非來自f()。注重Throwable在任何違例規(guī)范中都不是必需的。
  永遠(yuǎn)不必關(guān)心如何清除前一個(gè)違例,或者與之有關(guān)的其他任何違例。它們都屬于用new創(chuàng)建的、以內(nèi)存堆為基礎(chǔ)的對(duì)象,所以垃圾收集器會(huì)自動(dòng)將其清除。

上一篇:違例控制器

下一篇:捕獲所有違例

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人精品aaaa网站 | 免费视频99 | 久久九九热re6这里有精品 | 国产精品成人av片免费看最爱 | 精品久久www| 草久影视 | 毛片视频免费观看 | 成人毛片免费 | 欧美 videos粗暴| 欧美日韩国产成人在线 | 色操网| 久久久久久久久久91 | 中文字幕亚洲视频 | 日本高清无遮挡 | 色诱亚洲精品久久久久久 | 欧美一级黄色影院 | 国产亚洲精品yxsp | 久久久久国产一区二区三区不卡 | 久久我不卡 | 最新久久免费视频 | 久久久久成人免费 | 最新一区二区三区 | 国产精品久久久久久久av | 中文字幕一区2区 | 亚洲av一级毛片特黄大片 | 九九热视频免费 | 亚洲一区在线免费视频 | 欧美日韩亚洲成人 | 免费观看黄色一级视频 | 黄色淫片 | 久久久婷婷一区二区三区不卡 | 黄色羞羞视频在线观看 | 国产精品久久久久久久久岛 | 国产一级做a | 久久亚洲精品久久国产一区二区 | 欧美黄色小视频 | av91肉丝一区二区电影 | 日韩午夜一区二区三区 | 玖草| 精品av在线播放 | 精品一区二区亚洲 |