2013-05-02 104 views
1

我正在準備一個大學項目,我需要編寫一個自定義異常,它將在同一個包中由幾個類拋出沒有正確初始化。問題是,我必須讓用戶知道哪個這些類的不正確初始化(和扔除外)......所以,我在想是這樣的:如何獲得引發自定義例外的類的名稱

class InitializationException extends Exception { 

private static final String DEFAULT_MSG = 
      "This " + CLASSNAME-THROWINGME + " had not been initialized properly!"; 

    protected String msg; 

InitializationException() { 
    this.msg = DEFAULT_MSG; 
} 

    InitializationException(String msg) { 
    this.msg = msg; 
} 
} 

(順便說一句,能不能通過反射實現嗎?)

+2

你可以擴展'Exception'並添加一個字段中'.class'如果造成類型。 – 2013-05-02 17:01:55

+0

或者你可以爲每個班級制定一個例外... – 2013-05-02 17:02:20

+1

此外,反思幾乎肯定不是一個好主意。 – 2013-05-02 17:03:28

回答

1

喜歡的東西:

StackTraceElement[] trace = theException.getStackTrace(); 
String className = trace[0].getClassName(); 

(雖然我不能肯定是否要第一個元素或最後的痕跡)。

(請注意,您可以創建一個Throwable並將它做的getStackTrace(),而沒有把它扔,找出誰打電話給你(這將是微量元素1))

+0

你想要第一個。 API說'數組的第零個元素(假設數組的長度不爲零)表示堆棧的頂部,這是序列中最後一個方法調用。通常情況下,這是這個throwable被創建和拋出的點' – 2013-05-02 17:08:02

+0

@DilumRanatunga - 是的,我已經想通了,但我正在競速打敗你。雖然沒有成功。 – 2013-05-02 17:09:06

+0

關於unthrown'Throwable'的好提示。回答舊的問題「如果一個異常被實例化但從未拋出,是否真的有異常?」答案是「只有當你調用getStackTrace()來確認它的存在時」:) – 2013-05-02 17:16:47

0

它是一種解決方法:

你可以傳遞的C在構造函數中lassname,像

throw new InitializationException(getClass().getName()); 

,或者可以調用諸如

throw new InitializationException(this); 

類和處理名稱提取在excpetin類

InitializationExcpetion(Object context){ 
this.name = getClass().getName() 
} 
+0

'getEnclosingClass()'用於內部類。如果構造異常的類不是內部類,則它將是'null'。請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/Class。html#getEnclosingClass() – 2013-05-02 17:10:45

+0

謝謝你,我已經改變了評論 – MemLeak 2013-05-02 17:14:21

1

我只想通過投擲類如下:

public class InitializationException extends Exception { 

    public InitializationException(Class<?> throwingClass) { ... } 

    ... 
} 
1
class InitializationException extends Exception { 
    private final String classname; 
    InitializationException(String msg, Object origin) { 
     super(msg); 
     this.classname = origin != null ? origin.getClass().toString() : null; 
    } 
    public String getClassname() { 
     return this.classname; 
    } 
} 

。 。 。 。 throw new InitializationException(「出錯了」,this);

0

答案是你逼類拋出異常告訴例外,它是類:

public class InitializationException extends Exception { 

    public InitializationException(Class<?> c) { 
     super("The class " + c.getName()+ " had not been initialized properly!"); 
    } 
} 
相關問題