2017-02-15 51 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;被初始化的位置,当变量没有值时不能使用+=