[英]Cannot throw instance of private member class? - 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
運算符不適用於我的成員類,以及如何拋出私有成員類的實例。
如果我必須根據您發布的代碼片段猜測發生了什么,可能是因為您嘗試從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 ')'";
}
}
private
之后的static
表示ParenthesisException
不會將引用保存回封閉對象,這可能是您想要的。 這也意味着您可以在靜態方法中創建new ParenthesisException
。
希望這個猜測是正確的,希望這有幫助!
如果您之前沒有看到它,那么錯誤會有點混亂,但它正是它所說的:您不能使用非靜態上下文中的非靜態變量。 您的main方法,並且很可能是包含main方法的類中的任何方法都是靜態的,因此您不能使用非靜態變量。
ParenthesisException是非靜態的,因為您尚未將其聲明為靜態,但它在主類中聲明並在靜態方法中調用。
不要將此聲明為內部類 - 使您成為一個新的公共類。 然后,您就可以實例化此異常。
您的主要功能是“靜態上下文”。 你只能調用靜態函數,而不是'this'。 當您嘗試創建新的異常時,您有效地調用this.new ParenthesisException()
,因為異常是內部類。 但你不能這樣做。 您需要創建主類的istance,然后在該實例上創建異常對象。
MainClass m = new MainClass();
throw m.new ParenthesisException();
另一種解決方案是將您的異常定義為靜態類:
private static class ParenthesisException extends Throwable
然后,您可以從靜態上下文中實例化它,因此您不需要主類的實例。
沒有代碼這絕對是猜測,但基於錯誤消息,我相信這將工作。 如果你的main
類是Animal
那么你需要在main中實例化Animal
,如果你做一個簡單的...
new Animal();
作為唯一的main
然后制作一個新方法....
public Animal(){
/* put code that used to be in main */
}
這很可能會解決你的問題....再次沒有完整的代碼這是嚴格的猜測,但根據你說的和錯誤我相信這將解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.