2012-09-04 208 views
23

我有以下代碼:如何解決「方法代碼超過65535字節限制」?

public static void main(String[] args) { 
    try { 
     String[] studentnames = { 
      /* this is an array of 9000 strings... */ 
     }; 
    } 
} 

試圖編譯這個時候我得到以下錯誤:

The code of method main(String[]) is exceeding the 65535 bytes limit 
+3

'通過代碼屬性的exception_table(§4.7.3),LineNumberTable屬性中的索引大小(§4.7),每非本地非抽象方法的代碼量被限制爲65536字節。 8)和LocalVariableTable屬性(§4.7.9).'根據java doc http://docs.oracle.com/javase/specs/#88659 –

+0

它是9000或90,000? – lsof

回答

20

In java a methods can't have more than 65535 bytes.

所以要解決這個問題,請將您的main(String[] args)方法拆分爲多個子方法。

0

你的方法是太長。

創建不同的方法來分割它,並使其更具可讀性和可維護性。

9

錯誤代碼似乎很明顯。

The code of method main(String[]) is exceeding the 65535 bytes limit 

這是因爲在64Kb的Java中對於方法大小存在任意的硬編碼限制。 (實際上很多其他的東西都只限於64K,例如方法名稱,常量數量等。有關更多詳細信息,請參見Java 8 specsJava 7 specs。)

要解決此問題,您只需要中斷將您的main(String[] args)方法轉換爲多個子方法。


但是,爲什麼不直接從文件加載名稱?

一些與做您當前提議的方式的問題包括:

  • 首先,你硬編碼的細節,這幾乎總是一件壞事(見this);

  • 其次,您會收到該錯誤消息;和

  • 第三,你讓你的代碼很難閱讀。

還有很多,當然,但這些是明顯的。

+0

我爲什麼要加載文件?我正在做的是有一個數組,並做一個數組的打印?我在閱讀文件時沒有問題,但想知道爲什麼我們應該這樣做......我真的沒有得到數組是什麼 –

+4

有幾個問題:首先,您是硬編碼細節,幾乎總是壞事;其次,你會得到那個錯誤信息;第三,你讓你的代碼非常難讀。當然,還有更多,但這些是顯而易見的。 – Infiltrator

1

初始化studentnames數組正在計算主方法的大小。由於有9000個學生姓名,每個姓名在空間不足之前只能包含大約7個字符。正如其他人所說,你需要減少方法的大小。你可以將它分成塊,就像Pramod所說的那樣,但在這種情況下,方法的大部分實際上是數據。我會這樣做,因爲滲透者說,並分出名稱到一個單獨的文件,只讀在你的主。像commons-io這樣的東西可以用來讓你有效地使用與你相同的位置。

List<String> namelist = FileUtils.readLines(new File("studentnames.txt")); 
String[] studentnames = namelist.toArray(new String[0]); 

你可能會發現處理列表,而不是將其轉換爲一個數組或者你也可以使用一個LineIterator代替

LineIterator it = FileUtils.lineIterator(file); 
try { 
    while (it.hasNext()) { 
     String line = it.nextLine(); 
     // do something with line 
    } 
} finally { 
    it.close(); 
} 
1

我會從一個文件但一個工作讀學生的名字圍繞它將使類更小

String[] studentnames= "Student names is an array of :9000".split(" "); 

而不是定義和使用9000個字符串,這隻使用一個。單個字符串的限制超過20億。

+0

這會產生相同的錯誤:'靜態初始化程序的代碼超過了65535字節的限制。 – minipif

+0

@minipif你能解釋爲什麼那是因爲它不適合我。該字符串不在代碼塊中,因此不影響代碼塊大小。 –

+0

我試圖創建一個字符串,其中包含由空格分隔的前100000個素數,該字符串的長度爲710485.我聲明它具有'private static final',但出現錯誤'該類型生成需要超過65535字節的字符串進行編碼在常量池中採用Utf8格式。看起來你不能有一個長度超過65535的字符串字符串(源代碼中嵌入了字符串常量)。所以在這種情況下,從文件中讀取它是強制性的。 – minipif

1

The code of method main(String[]) is exceeding the 65535 bytes limit

正如你的錯誤說主要方法超過了65535字節的限制。

原因:爲什麼我們的代碼中出現這個錯誤?

  • 我們知道數組的內存分配將按順序完成。即;如果內存中有這麼大的空間可用,那麼將爲該陣列分配內存。
  • 我們已經使用String數組持有一些「9000」的字符串 - 這是太大的內存
  • 的RAM可能沒有這樣的那段時間,讓一個巨大的連續空間來存放,我們可能已經得到了錯誤。

解決方案:那麼我能做些什麼呢?

  • 用於存儲這樣龐大的規模價值,我們可能更喜歡的文件進行讀/寫 - 所以,當需要
  • 我們可以存儲這些字符串在它生長的內存時,元素的ArrayList中,我們可以讀取文件的一部分被添加到它而不是最初分配整個內存。
0

只是將您的代碼中的字符串外部化爲一個* .properties/xml/json文件。 Netbeans和/或Eclipse可以爲你輕鬆完成。

相關問題