2017-02-15 257 views
0

我是一名初學者,但我嘗試構建練習,並遇到了這個問題。用戶輸入捐款,按下按鈕和捐款增值。我寫了整個代碼,但是當我點擊按鈕添加到捐款計數,應用程序崩潰。我遵循了我老師的所有教導。我在活動中創建了一個方法,在ui構建器中,我通過點擊屬性中的按鈕並將其設置爲該方法。它應該順利,但是當我點擊按鈕時它會崩潰。這是我將onClick屬性設置爲computeDonation的活動。Android Studio應用在按鈕點擊後不斷崩潰

public void computeDonation(View v){ 

    String addedText = ((EditText)findViewById(R.id.AmountText)).getText().toString(); 

DonationModel donation = new DonationModel(addedText); 
String answer = donation.calcDonation(); 

((TextView)findViewById(R.id.totalText)).setText(answer);} 

這是模型:

String textAdded; 
double addedDonation; 

public DonationModel(String y){ 
    textAdded = y; 
} 

public String calcDonation(){ 
    double counter = Double.parseDouble(textAdded); 
    addedDonation += counter; 

    Locale locale = new Locale("en", "CA"); 
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 

    return fmt.format(addedDonation); 

} 

伊夫甚至試圖未經數字格式只是爲了看它是否發回活動,但事實並非如此。順便說一句我的課我正在使用舊版的android studio。

這是logcat的: 02-15 17:12:28.797 21619-21619/ca.roumani.donations E/AndroidRuntime:致命異常:主 工藝:ca.roumani.donations,PID:21619 的java。 lang.IllegalStateException:無法執行Android的android方法:onClick at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5197) at android.view.View $ PerformClick.run(View.java:20909) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java .lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 產生的原因:在在java.lang.reflect.Method.invoke(本機方法) java.lang.reflect.InvocationTargetException java.lang.reflect.Method.in voke(Method.java:372) at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5197) at android。 view.View在android.os.Handler.dispatchMessage(Handler.java:95) 上的android.os.Handler.handleCallback(Handler.java:739) (View.java:20909) 。 os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect .Method.invok e(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 由於:java.lang.NumberFormatException:無效的雙精度:「」 at java.lang.StringToReal.invalidReal(StringToReal.java:63) at java.lang.StringToReal.parseDouble(StringToReal.java:267) at java .lang。Double.parseDouble(Double.java:301) at ca.roumani.donations.DonationModel.calcDonation(DonationModel.java:20) at ca.roumani.donations.DonationActivity.computeDonation(DonationActivity.java:24) at java。 lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)java.lang.reflect.Method.invoke(Method.java:372) ) at android.view.View.performClick(View.java:5197) at android.view.View $ PerformClick.run(View.java:20909) at android.os.Handler.handleCallback(Handler.java:739 ) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java :1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

+0

我敢打賭你有'NullPointerException'。發佈你的logcat。 –

+0

我複製並粘貼了全部爲紅色的logcat – Chris

+0

只是一個猜測:嘗試Locale locale = new Locale(「en_CA」) – LSA

回答

4

好像你textAdded是一個空字符串,這將導致NumberFormatException異常和崩潰您的應用程序。你能做些什麼來防止這種情況,是分析前檢查,如果你的textAdded不爲空:從用戶在EditText上視圖中輸入一個值之前被調用

public String calcDonation() { 
    if (TextUtils.isEmpty(textAdded)) { 
     //textAdded is empty, so just return an empty String 
     return ""; 
    } 
    //We're sure that textAdded has a value, so we can try to parse it 
    double counter = Double.parseDouble(textAdded); 
    addedDonation += counter; 

    Locale locale = new Locale("en", "CA"); 
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 

    return fmt.format(addedDonation); 
} 

或者只是防止方法:

public void computeDonation(View v){ 
    String addedText = ((EditText)findViewById(R.id.AmountText)).getText().toString(); 
    if (TextUtils.isEmpty(textAdded)) { 
     Toast.makeText(context, "Please enter a valid number", Toast.LENGTH_SHORT).show(); 
    } else { 
     DonationModel donation = new DonationModel(addedText); 
     String answer = donation.calcDonation(); 
     ((TextView)findViewById(R.id.totalText)).setText(answer); 
    } 
} 
1

問題是,您試圖將空字符串解析爲double。在進行任何計算之前,您需要驗證用戶是否輸入了有效數據。幫助你做到這一點的一種方法是將計算從字符串傳遞和格式中分離出來。我建議你修改calcDonation(),以便它只處理數字數據。另一種方法可能會擔心將數字轉換爲字符串和從字符串轉換。這將允許您驗證用戶輸入並在必要時顯示適當的錯誤消息。

2

我看不到double addedDonation;被初始化的位置,當變量沒有值時不能使用+=