2011-07-24 48 views
4

這個錯誤是什麼意思,它爲什麼適用?我無法在Google中找到關於成員類和靜態上下文的更多信息,或者這些意思與我的情況有關。不能拋出私有成員類的實例? - Java

這裏是我得到的錯誤:

non-static variable this cannot be referenced from a static context

它指出,這條線,並在new操作:

throw new ParenthesisException();

ParenthesisException是私有成員類的主類。我認爲這個問題可能與此有關,但這只是我能想到的一切。

這是我對ParenthesisException的定義。這是主要的類定義:(對不起,如果格式不是很好)

private class ParenthesisException extends Throwable 
{ 
    public ParenthesisException(){} 
    public String strErrMsg() 
    { 
     return "ERROR: Every '(' needs a matching ')'"; 
    } 
} 

我找到錯誤消息,而神祕。我希望對「靜態上下文」的簡要解釋以及爲什麼new運算符不適用於我的成員類,以及我如何拋出一個私有成員類的實例。

+1

您需要發佈錯誤代碼。私人班似乎不是問題。 – g051051

回答

6

如果我必須根據您發佈的代碼片段猜測發生了什麼,則可能是由於您試圖從static方法中拋出ParenthesisException而導致的錯誤。

在Java中,在另一個類中定義的類自動存儲一個指向創建它們的對象的指針。那是ParenthesisException有一個隱含的指針,它返回到其內部使用new創建的類中。這意味着,特別是,您不能在static方法內構建new ParenthesisException,因爲沒有可用於引用包含類的this指針。

爲了解決這個問題,你應該ParenthesisException一個static內部類是這樣的:

private static class ParenthesisException extends Throwable 
{ 
    public ParenthesisException(){} 
    public String strErrMsg() 
    { 
     return "ERROR: Every '(' needs a matching ')'"; 
    } 
} 

staticprivate後說,ParenthesisException不持有引用回到一個封閉的對象,這可能是你無論如何。這也意味着您可以在靜態方法內部創建new ParenthesisException

希望這個猜測是正確的,希望這有助於!

+0

我感謝您的解釋!它似乎已經工作了。謝謝! – Uronym

0

如果您之前沒有看到它,該錯誤有點令人困惑,但它正是這樣說的:您無法在非靜態上下文中使用非靜態變量。你的主要方法和很可能包含你的主要方法的類中的任何方法都是靜態的,所以你不能使用它的非靜態變量。

ParenthesisException是非靜態的,因爲您尚未將其聲明爲靜態,但它在您的主類中聲明並在靜態方法中調用。

不要聲明這是一個內部類 - 讓你成爲一個新的公共類。然後你就可以實例化這個異常。

0

您的主要功能是'靜態上下文'。你只能調用靜態函數,並沒有'this'。當您嘗試創建新的異常時,您有效地調用this.new ParenthesisException(),因爲該異常是內部類。但你不能那樣做。您需要創建主類的遺傳,然後在該實例上創建異常對象。

MainClass m = new MainClass(); 
throw m.new ParenthesisException(); 

另一種解決方案是定義異常作爲靜態類:

private static class ParenthesisException extends Throwable 

然後你就可以從靜態上下文實例,所以你並不需要主類的一個實例。

0

沒有代碼,這是嚴格的猜測,但基於錯誤信息,我相信這會起作用。如果您main類是Animal那麼您需要實例Animal這樣的主內,如果你做一個簡單的...

new Animal();作爲唯一的行main

然後作出一個新的方法....

public Animal(){ 
    /* put code that used to be in main */ 
} 

這將最有可能解決您的問題....再次沒有完整的代碼這是嚴格的猜測,但根據你說的和我認爲這將解決問題的錯誤。