生成后APK崩溃

时间:2019-10-08 07:34:32

标签: java android

使用更好的信息编辑以前的帖子:

APP摘要: 2节 第1节有两个textnumber输入+ 1个计算按钮+ 1个textview结果 第2节有两个文本数字输入+ 1个计算按钮+ 1个textview结果

因此,启动后一切正常,没有崩溃。

现在,如果所有4个文本数字输入都不为空,则按按钮1它将计算结果并将其放入结果1,但会将结果2重置为0。如果我按第二个按钮,则会发生相反的情况。计算正确完成,结果2中保留了正确性,但结果1重置为0。

但是,如果4个输入中的任何一个恰好为空,则APP将会退出。当前修改的代码在下面,崩溃时也会调试结果。

package com.example.salescalculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
        implements View.OnClickListener{

    Button Pricebutton, MaxCostbutton;
    EditText num1, num2, num3, num4;
    TextView result1, result2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        num1 = (EditText) findViewById(R.id.costinput);
        num2 = (EditText) findViewById(R.id.margininput);
        num3 = (EditText) findViewById(R.id.tpinput);
        num4 = (EditText) findViewById(R.id.margininput2);
        Pricebutton = (Button) findViewById(R.id.buttoncalcprice);
        MaxCostbutton = (Button) findViewById(R.id.buttoncalculatecost);
        result1 = (TextView) findViewById(R.id.priceresult);
        result2 = (TextView) findViewById(R.id.maxcostresult);

        Pricebutton.setOnClickListener(this);
        MaxCostbutton.setOnClickListener(this);
    }
            public void onClick(View v) {
        float cost1, margin1, custTP, margin2;
        float result1A = 0;
        float result2B = 0;

        cost1=Float.parseFloat(num1.getText().toString());
        margin1=Float.parseFloat(num2.getText().toString());
        custTP=Float.parseFloat(num3.getText().toString());
        margin2=Float.parseFloat(num4.getText().toString());

                if (!TextUtils.isEmpty(num1.getText().toString())) {
                    cost1 = Float.parseFloat(num1.getText().toString());
                }
                if (!TextUtils.isEmpty(num2.getText().toString())) {
                    margin1 = Float.parseFloat(num2.getText().toString());
                }
                if (!TextUtils.isEmpty(num3.getText().toString())) {
                    custTP = Float.parseFloat(num3.getText().toString());
                }
                if (!TextUtils.isEmpty(num4.getText().toString())) {
                    margin2 = Float.parseFloat(num4.getText().toString());
                }

        if(v.getId()==R.id.buttoncalcprice) {
            result1A = cost1 / (1- (margin1/100));
        }

        else if (v.getId()== R.id.buttoncalculatecost) {

            result2B = custTP - ((margin2/100)*custTP);
        }

                result1.setText(result1A + "");
                result2.setText(result2B + "");

            }
}

崩溃日志

 --------- beginning of crash
2019-10-08 16:46:48.544 4994-4994/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.salescalculator, PID: 4994
    java.lang.NumberFormatException: empty String
        at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1071)
        at java.lang.Float.parseFloat(Float.java:459)
        at com.example.salescalculator.MainActivity.onClick(MainActivity.java:44)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
2019-10-08 16:46:48.555 1381-1425/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 1473729 , only wrote 1473120  

4 个答案:

答案 0 :(得分:0)

一开始,确实值得推荐您学习调试,这样做可以节省大量时间,而不是运行应用程序,然后尝试手动找出问题所在。

第二,我运行了您的代码,它可以正常工作。输入的内容为空或没有数字时,您无需进行任何检查,但是如果输入正确,则代码本身可以工作。

编辑:

您的带有更改支票的代码可能如下所示:

 public void onClick(View v) {
    float cost1, margin1, custTP, margin2;
    float result1A = 0;
    float result2B = 0;


    if (!num1.getText().toString().isEmpty() && num1 != null){
        cost1 = Float.parseFloat(num1.getText().toString());
    } else {
        cost1 = 0f;
    }

    if (!num2.getText().toString().isEmpty() && num2 != null){
        margin1 = Float.parseFloat(num2.getText().toString());
    } else {
        margin1 = 0f;
    }

    if (!num3.getText().toString().isEmpty() && num3 != null){
        custTP = Float.parseFloat(num3.getText().toString());
    } else {
        custTP = 0f;
    }

    if (!num4.getText().toString().isEmpty() && num4 != null){
        margin2 = Float.parseFloat(num4.getText().toString());
    } else {
        margin2 = 0f;
    }


    if(v.getId()==R.id.buttoncalcprice) {
        result1A = cost1 / (1- (margin1/100));
    }

    else if (v.getId()== R.id.buttoncalculatecost) {

        result2B = custTP - ((margin2/100)*custTP);
    }

    result1.setText(result1A + "");
    result2.setText(result2B + "");
}

还要确保在EditText中声明只希望通过android:inputType输入这样的数字:

<EditText
    android:id="@+id/costinput"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" />

答案 1 :(得分:0)

您的onClick的{​​{1}}方法中的错误是“ java.lang.NumberFormatException:空字符串”(您的错误消息包含所有这些详细信息)。这意味着您的Float.parseFloat中的一个文本为空(在活动中选中41行:EditText)。因此,您需要在解析at com.example.salescalculator.MainActivity.onClick(MainActivity.java:44之前验证文本是否为空。

更新: 看来您正在尝试在检查之前解析float:

Float

答案 2 :(得分:0)

import Koa from 'koa' const app = new Koa() app.use(ctx => { ctx.body = 'Hello World' }) app.listen() export default { path: '/example', handler: app.callback() } 格式的值(除了可以转换为数字的值)不能转换为String或任何原始类型的数字,例如floatIntegerdouble等。因此,首先检查short中的输入值是否为空,并使EditText仅接受xml中的十进制数字。

使用此代码可以解决您的问题:

EditText

答案 3 :(得分:0)

无论何时使用parse,都必须用try / catch包围该区域。这是因为空字符串无法解析为数字(浮点数,双精度数和整数)。因此:

try{
   if (!num1.getText().toString().isEmpty() && num1 != null){
        cost1 = Float.parseFloat(num1.getText().toString());
    } else {
        cost1 = 0f;
    }

    if (!num2.getText().toString().isEmpty() && num2 != null){
        margin1 = Float.parseFloat(num2.getText().toString());
    } else {
        margin1 = 0f;
    }

    if (!num3.getText().toString().isEmpty() && num3 != null){
        custTP = Float.parseFloat(num3.getText().toString());
    } else {
        custTP = 0f;
    }

    if (!num4.getText().toString().isEmpty() && num4 != null){
        margin2 = Float.parseFloat(num4.getText().toString());
    } else {
        margin2 = 0f;
    }

} catch(NumberFormatException e){
  e.printStackTrace()
}

顺便说一句,即使在调试模式下,这也是一个问题,不仅是在您释放APK时。