2010-04-13 154 views
12

我有類DirReader和搜索。搜索使用DirReader。我希望搜索知道DirReader何時拋出異常。那麼我怎麼能讓類拋出異常呢?Java:異常拋出類?

目前,我使用initCorrect -dummy var。異常風格的方法可能更合適。

簡單的例子錯誤

$ javac ExceptionStatic.java 
ExceptionStatic.java:4: '{' expected 
public class ExceptionStatic throws Exception{ 
          ^
1 error 

代碼

import java.util.*; 
import java.io.*; 

// THIS PART NEEDS TO BE FIXED: 
public class ExceptionStatic throws Exception{ 

    private static boolean initCorrect = false; 

    public static String hello; 
    static{ 
     try{ 
      hello = "hallo"; 

      //some other conditionals in real code 
      if(true) throw new Exception(); 

      initCorrect=true; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 
     if(initCorrect) 
      System.out.println(hello); 
    } 
} 

回答

4

它是一類初始化一個編譯時錯誤(「靜態塊」)的檢查異常終止。

如果類初始化程序拋出未檢查的異常,則初始化該類的第一次嘗試將引發一個ExceptionInInitializeError。任何後續使用該課程的嘗試都將導致NoClassDefFoundError。如果你真的想要使用異常,請在初始化程序中輸入類似RuntimeException的內容。

但是,問題—中顯示的方法在正確初始化類時設置了一個標記—對於許多應用程序來說實際上可能是更好的方法。更具體地說,我會說,除非你想讓整個程序在發生初始化失敗時終止,否則使用一個標誌。只要從類聲明中刪除「throws」子句,因爲這不是合法的語法。

+0

然後,您可以執行的操作是如果DirReader類中的每個方法都無法正確初始化,則會引發異常。 – 2010-04-13 19:05:36

3

類不能拋出異常。只有方法可能會拋出異常。避免使用基類Exception類。拋出一個特定的異常,如IllegalStateException或擴展Exception並製作你自己的。

4

你有一個引發異常的靜態代碼塊?如果你真的需要這樣做,就拋出一個RuntimeException - 否則將你的邏輯轉移到與DirReader或Search類關聯的方法中,並讓這些方法拋出相應的Exception

這裏你就可以開始用一個例子:

public class test { 


    static { 
     try { 
      method1(); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(); 
     } 
    } 

    protected static void method1() throws InterruptedException {   
     Thread.sleep(1000);   
    } 


} 
+1

RuntimeException不能從靜態初始化塊中拋出。您將收到一個編譯錯誤「初始化程序沒有正常完成」。 – 2010-04-13 18:53:24

+0

請注意,引發RuntimeException將使類加載器引發異常,並且類加載相對不可預知(除非它在您使用類之前發生)。 – 2010-04-13 18:55:28

+0

@jonathon我剛剛試過一個在靜態初始化器中拋出NullPointerException的類。它編譯好,但當我試圖訪問它時拋出java.lang.ExceptionInInitializerError。在靜態初始化程序中拋出異常 – 2010-04-13 18:59:18

24

throws關鍵字不能在類級別應用,只能在方法級別應用。

+1

謝謝!沒有人提到這一點。 – NoName 2017-07-17 01:16:19