[英]Android using Firebase Build APK working fine but release APK crashes
[英]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.parseFloat
的onClick
方法中的错误是“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
或任何原始类型的数字,如Integer
、 double
、 short
等。因此,首先检查输入值是否为空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.