[英]Android Studio app keeps crashing after button click
我是 Java 初学者,但我正在尝试构建练习,但遇到了这个问题。 用户输入捐赠,按下按钮,捐赠的价值就会增加。 我已经编写了整个代码,但是当我单击按钮添加到捐赠计数时,应用程序崩溃了。 我遵循了我老师的所有教导。 我在活动中创建了一个方法,在 ui 生成器中,我转到 click 属性上的按钮并将其设置为该方法。 它应该顺利进行,但是每当我单击按钮时它就会崩溃。 这是我将 onClick 属性设置为 computeDonation 的活动。
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。
这是日志猫:
02-15 17:12:28.797 21619-21619/ca.roumani.donations E/AndroidRuntime:致命异常:主进程:ca.roumani.donations,PID:21619 java.lang.IllegalStateException:无法执行android:onClick的方法在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 在 android.view.View.performClick(View.java:5197) 在 android.view.View$PerformClick.run(View.java) :20909) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 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) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 引起:java.lang.reflect.InvocationTargetException at java.lang.reflect .Method.invoke(Native Method) a t java.lang.reflect.Method.invoke(Method.java:372) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java) :5197) 在 android.view.View$PerformClick.run(View.java:20909) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95)在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5942) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect .Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) ) 引起: java.lang.NumberFormatException: Invalid double: "" at java.lang.StringToReal.invalidReal(StringToReal.java:63) at java.lang.StringToReal.parseDouble(StringToReal.java:267) at java.lang。位于 ca.roumani.donations 的 Double.parseDouble(Double.java:301)。 DonationModel.calcDonation(DonationModel.java:20) at ca.roumani.donations.DonationActivity.computeDonation(DonationActivity.java:24) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method。 invoke(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 $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 章
您的 textAdded 似乎是一个空字符串,这会导致 NumberFormatException 并使您的应用程序崩溃。 为了防止这种情况,您可以做的是在解析之前检查您的 textAdded 是否为空:
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);
}
或者只是防止在用户在 EditText 视图中输入值之前调用该方法:
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);
}
}
我看不到在哪里double addedDonation;
已初始化,当变量没有值时不能使用+=
。
问题是您试图将空字符串解析为双精度值。 在进行任何计算之前,您需要验证用户输入的数据是否有效。 帮助您执行此操作的一种方法是将计算与字符串传递和格式设置分开。 我建议您修改calcDonation()
使其仅处理数字数据。 另一种方法可能会担心在数字与字符串之间进行转换。 这将允许您验证用户输入并在必要时显示适当的错误消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.