2012-07-03 54 views
7

我有一個靜態方法返回一個字符串,但如果傳入的字符串與幾個單詞中的某一個不匹配,我想引發異常。下面的代碼只是我嘗試做的一個示例,但我一直在我拋出異常的行上收到「無法從靜態上下文中引用的非靜態變量」消息。基本上,getMsg的返回值必須有效,否則程序無法繼續,所以我需要一種方法來解決這個問題。返回值的靜態方法是否會拋出異常?

public static String getMsg(String input) throws UnknownInputException{ 
     if (input.equals("A")){ 
      return "key for A"; 
     } 
     throw new UnknownInputException("Some Message"); 
     return "unknownInput"; 
+2

它不會編譯。 – user1154644

+2

此代碼與您發佈的錯誤消息不匹配。您需要發佈實際的錯誤消息,並讓我們知道哪條線路正在導致它。 –

回答

5

該問題是由以下事實引起的:UnknownInputException可能是一個嵌套類,如果使用new運算符將其實例化爲嵌套類,它應該可以訪問「父」對象 - 它不會因爲類是在靜態上下文中實例化的。有關詳細信息,請參閱Static method returning inner class

一個可能的解決辦法是宣佈UnknownInputExceptionstatic這樣的:

private static class UnknownInputException extends Exception { ... } 

當然,你將無法訪問任何實例(非靜態)從這個類的方法和/或字段,但在你的情況下這可能不是問題(特別是在Exception類的情況下)。

此外,throw行之後的ing值是不必要的,因爲執行永遠不會到達該行。

2

可變沒有在給定的示例代碼所指出的,因此它不能導致錯誤。

代碼return "unknownInput";是冗餘的,因爲從未執行。

必須有另一種靜態方法,其中使用this,導致錯誤。

+0

我看到你關於返回值的觀點,但沒有返回一個String的方法必須返回一個值? – user1154644

+0

如果它引發異常或錯誤,則不會。 –

+0

好的。在我的方法中,沒有任何地方使用「this」這個詞,所以我不知道爲什麼我會遇到編譯錯誤。 – user1154644

0

它在Java中完全合法的從靜態方法中拋出異常。 然而,你在這裏提出的代碼甚至不能編譯:) 所以提供所有的代碼。

你在這裏得到的錯誤只是說你使用靜態方法在類中定義的非靜態數據字段。 靜態方法不屬於任何實例,但數據字段不...

0

首先,return "unknownInput";行將永遠不會執行。它沒有在那裏顯示死代碼警告?

而你的方法沒有任何'this'引用,你確定它抱怨這個方法嗎?

2

UnknownInputException是一個內部類。一旦我把它變成靜態的,代碼編譯得很好。謝謝你們的幫助。

+1

在Java中創建內部異常類是不正常的做法。事實上,我不記得看到一個知名的API來做到這一點。考慮讓它成爲頂級課程。 –