2013-05-18 57 views
0

功能我有這個功能收到錯誤:「非靜態方法不能從靜態上下文中引用」同時呼籲從主

private ArrayList<Letters> getLettersInfo(String input) 
{ 
     ArrayList<Letters> al = new ArrayList<Letters>(); 
     for (char c : ALPHABET.toCharArray()) 
     { 
      Letters l = new Letters(); 
      l.setLetter(Character.toString(c)); 
      int count = countOccurrences(input, c); 
      l.setCount(count); 
      l.setFrequency(count/28); 
      al.add(l); 
     } 
     return al; 
} 

然後我嘗試這在我的主:

ArrayList<Letters> al = new ArrayList<Letters>(); 
al = getLettersInfo(plainText); 
for(Letters l : al) 
{ 
     System.out.print("Letter: " + l.getLetter() + ", " 
       + "Count: " + l.getCount() + ", " 
       + "Frequency: " + l.getFrequency()); 
} 

但我得到non static method cannot be referenced from a static context。我讀了一些關於這個錯誤的東西,但似乎一切都好。任何幫助?

+0

但它不是,因爲你試圖從你的靜態函數調用實例方法。要麼創建一個實例,要麼使該方法成爲靜態的。 –

+0

努力尋找愚蠢,每個人。 –

回答

2

的功能更改爲:

private static List<Letters> getLettersInfo(String input) 

雖然我們是在它,我建議如下重構:

for(Letters l: getLettersInfo(plainText)) 
{ 
     System.out.print(String.format("Letter: %s, Count: %d, Frequence: %d", 
      l.getLetter(), 
      l.getCount(), 
      l.getFrequency()); 
} 

你也許是新的Java建議您稍後瞭解static和第一優先考慮基礎知識。因此,我建議你創建一個單獨的類,它只包含你的main方法,並把所有其他的東西放在不同的類中。

在你的情況,那麼你的main會是什麼樣子

public static void main(String[] args) 
{ 
    Info info = new Info(); // your newly created class 
    for(Letters l: info.getLettersInfo(plainText)) 
    { 
     // ... 
    } 
} 

或(與info內聯):

public static void main(String[] args) 
{ 
    for(Letters l: new Info().getLettersInfo(plainText)) 
    { 
     // ... 
    } 
} 
+0

你應該解釋*爲什麼他們應該改變他們的代碼。 –

+0

如果該方法不涉及在對象本身中設置值,則只需執行此操作。如果確實涉及到這一點,則需要嘗試下面的方法。如果沒有,這種方式更有意義。 –

0

的錯誤意味着你不能說這是不是靜態的方法的方法這是靜態的。

主要方法是靜態的,所以它不能調用任何類非靜態方法,除非您實例化類的實例並調用該實例上的方法。

例如:

MyClass foo = new MyClass(); 
... 
a1 = foo.getLettersInfo(plainText); 
0

I read somethings about this error but it seems all ok. Any help?

我不這麼認爲。

main方法本質上宣佈static,因爲它需要的是這樣一來就能作爲程序的入口點工作,而你的

private ArrayList<Letters> getLettersInfo(String input) 

未聲明static它不依附於任何實例所以您無法從static上下文中調用它,因爲getLettersInfo應該被調用附加到特定實例。我不確定是什麼讓你覺得一切正常。通過添加關鍵字,將getLettersInfo轉換爲static方法。

+0

它不是「固有的」靜態的,它是*聲明的*靜態的。 –

+0

使程序工作本質上是靜態的。否則,你將無法運行它。它不是「靜態」的,因爲你不得不聲明它是靜態的,否則它不能達到它的目的。 – Jack

+0

@DaveNewton如果你不聲明主靜態,它不是一個真正的主要方法。沒有它,你的程序不會直接從那個類文件中運行。這就是爲什麼傑克說它是繼承性靜態的原因:因爲它必須這樣聲明。 –

相關問題