【问题标题】:Android Studio app keeps crashing after button click单击按钮后,Android Studio 应用程序不断崩溃
【发布时间】:2017-07-04 19:36:22
【问题描述】:

我是 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: 致命异常: main 进程: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) 在 java.lang.reflect.Method.invoke(本机方法) 在 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.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在 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(本机方法) 在 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:无效双:“” 在 java.lang.StringToReal.invalidReal(StringToReal.java:63) 在 java.lang.StringToReal.parseDouble(StringToReal.java:267) 在 java.lang.Double.parseDouble(Double.java:301) 在 ca.roumani.donations.DonationModel.calcDonation(DonationModel.java:20) 在 ca.roumani.donations.DonationActivity.computeDonation(DonationActivity.java:24) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在 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(本机方法) 在 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)

【问题讨论】:

  • 只是猜测:尝试 Locale locale = new Locale ("en_CA")
  • "at ca.roumani.donations.DonationModel.calcDonation(DonationModel.java:20)" DonationModel.java 的第 20 行是什么?

标签: java android android-studio button crash


【解决方案1】:

您的 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);
    }
}

【讨论】:

    【解决方案2】:

    看不到double addedDonation;在哪里初始化,变量没有值的时候不能使用+=

    【讨论】:

      【解决方案3】:

      问题是您试图将空字符串解析为双精度。在进行任何计算之前,您需要验证用户输入的数据是否有效。帮助您执行此操作的一种方法是将计算与字符串传递和格式化分开。我建议你修改calcDonation(),让它只处理数字数据。另一种方法可能会担心数字与字符串之间的转换。这将允许您验证用户输入并在必要时显示适当的错误消息。

      【讨论】:

        猜你喜欢
        • 2021-02-15
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多