2012-03-11 74 views
0

我有一個非常罕見的問題,無法在網上找到關於這個問題的任何信息!「合成參數太多......」錯誤。我如何規避/解決它?

我在Android應用程序中有一個按鈕,並且該按鈕的代碼讓我發瘋。顯然有一些模仿,你可以在你的按鈕程序中做多少「if」句子?

這裏有一些snippits(順便說一句,ETX =的EditText):

button.setOnClickListener(new View.OnClickListener() { 
public void onClick(View view) { 
    if (et1.getText().length()+et2.getText().length()==10) {keys++; oneStr=oneStr+et1.getText().toString()+" "+et2.getText().toString()+" ";} 
    if (et3.getText().length()+et4.getText().length()==10) {keys++; oneStr=oneStr+et3.getText().toString()+" "+et4.getText().toString()+" ";} 
    if (et5.getText().length()+et6.getText().length()==10) {keys++; oneStr=oneStr+et5.getText().toString()+" "+et6.getText().toString()+" ";} 

這一直持續到:

if (et293.getText().length()+et294.getText().length()==10) {keys++; oneStr=oneStr+et293.getText().toString()+" "+et294.getText().toString()+" ";} 
    if (et295.getText().length()+et296.getText().length()==10) {keys++; oneStr=oneStr+et295.getText().toString()+" "+et296.getText().toString()+" ";} 

因此總的來說148 「如果」 的句子!

確切的日食錯誤文本是: 「太多的合成參數,模擬參數val $ et253是超過255個字資格方法極限參數

如果我刪除所有的「如果」的句子後幷包括:

if (et253.getText().length()+et254.getText().length()==10) {keys++; oneStr=oneStr+et253.getText().toString()+" "+et254.getText().toString()+" ";} 

錯誤不再存在,程序適用於許多如果句子已經存在。所以顯然有些錯誤,但我不明白這個錯誤?

所以,當我從148「如果」去125「如果」句子應用程序可以編譯!

預先感謝您!

+4

您確定要編寫此代碼嗎?爲什麼不使用數組。它必須是另一種解決方案,而不是這種可怕的代碼重複。 – theomega 2012-03-11 23:38:43

+0

代碼可能會更聰明地創建,而不是代碼重複。對於這個特定的活動,我有很多這方面的知識,但根本不知道如何處理它。所以我做了一個python腳本,可以爲我創建所有這些重複。 我已經看過這篇文章http://stackoverflow.com/questions/5740708/android-clearing-all-edittext-fields-with-clear-button ,因爲我後來用數據填充了一些EditTexts,但是那個特殊的代碼片段在我的程序中顯然不是問題! – MCEinar 2012-03-11 23:54:32

+0

你真的在同一個屏幕上有〜255個edittexts嗎? – njzk2 2012-03-12 10:02:55

回答

0

看它是否在循環中執行148個動作時編譯。如果這樣的話,使用A LOOP做類似的動作148次...

+0

在我的onCreate我有! 最終的EditText ET1 =(EditText上)findViewById(R.id.EditText001); ... 最終的EditText et296 =(EditText上)findViewById(所以我應該把這些EditTexts在onCreate方法的數組中,並將數組傳遞給onclicklistener按鈕? – MCEinar 2012-03-12 10:15:29

+0

Yes。et [0] =(EditText)findViewById(R。 id.EditText001); ...更好的是你可以製作它們也在循環中。 – AJcodez 2012-03-13 18:15:47

+0

非常感謝你的解釋。我使用循環使它工作:) – MCEinar 2012-03-13 22:26:33

1

從我所瞭解的情況來看,當Java實現閉包(我在這裏使用鬆散的術語)時,它會作弊並創建一個副本給引用以合成參數的形式變量。從錯誤中可以看出,使用這種機制可以將匿名內部類引入的變量數量有一個上限。

如果將etnnn變量轉換爲數組et[nnn],那麼很可能會出現問題,因爲您只需要引入一個變量而不是數百個變量。其可能與您的問題

一個參考是從Java VM Specification, Section 4.10

的方法參數的數量由的 定義的方法描述符(§4.3.3),其中限制限制爲255個在實例或接口方法調用的情況下,這包括一個用於 的單元。注意 說明方法描述符是根據方法 參數長度的概念定義的,其中long或double型的參數貢獻了兩個單位的長度,所以這些類型的參數 進一步減少了限制。

+1

非常感謝你的解釋。我使用循環遍歷應用程序:) 實際上.apk大小也下降了大約200kb這是非常好的;) – MCEinar 2012-03-13 22:29:16

相關問題