簡體   English   中英

構建后 Apk 崩潰

[英]Apk crashes after build

用更好的信息編輯以前的帖子:

APP 總結:2 個部分 第 1 部分有兩個文本數字輸入 + 1 個計算按鈕 + 1 個 textview 結果 第 2 部分有兩個文本數字輸入 + 1 個計算按鈕 + 1 個 textview 結果

所以,在啟動時一切都很好,沒有崩潰。

現在,如果所有 4 個 textnumber 輸入都不為空,如果您按下按鈕 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  

起初,學習調試是非常值得推薦的,這樣做可以節省很多時間,而不是運行應用程序然后嘗試手動找出問題所在。

其次,我運行了您的代碼並且它有效。 無論輸入是否為空或不是數字,您都不會進行任何檢查,但如果您提供正確的輸入,則代碼本身就可以工作。

編輯:

例如,您更改支票的代碼可能如下所示:

 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" />

Float.parseFloatonClick方法中的錯誤是“java.lang.NumberFormatException:空字符串”(您的錯誤消息包含所有這些詳細信息)。 這意味着您的EditText之一有空文本(檢查活動中的第 41 行: at com.example.salescalculator.MainActivity.onClick(MainActivity.java:44 )。因此您需要在解析Float之前驗證文本不為空.

更新:您似乎正在嘗試在檢查之前解析浮點數:

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());
}

String格式的值(除了可以轉換為數字)不能轉換為float或任何原始類型的數字,如Integerdoubleshort等。因此,首先檢查輸入值是否為空EditText並使EditText只輸入來自 xml 的十進制數字。

使用此代碼可以解決您的問題:

<EditText
     android:id="@+id/editText1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:ems="10"
     android:inputType="numberDecimal" />

每當您使用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 時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM