【问题标题】:Fix app keeps stopping made with android studio [closed]修复应用程序不断停止使用 android studio [关闭]
【发布时间】:2021-11-13 23:33:51
【问题描述】:

我是 android 开发领域的新手。昨晚我从 youtube 教程中制作了一个简单的计算器,幸运的是我成功地制作了它。这是代码

main.xml:-

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top|center">

    <ImageView
        android:layout_height="120dp"
        android:layout_width="120dp"
        android:src="@drawable/cal"/>

    <EditText
        android:layout_width="wrap_content"
        android:inputType="number"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:hint="@string/fstval"
        android:id="@+id/etFirstValue"/>

    <EditText
        android:layout_width="wrap_content"
        android:inputType="number"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:hint="@string/sndval"
        android:id="@+id/etSecondValue"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:hint="@string/ans"
        android:textColorHint="#FF0F00"
        android:id="@+id/tvAns"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"
        android:layout_marginTop="19dp"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:background="#4C5866"
        android:padding="10dp"
        android:textColor="#000000"
        android:textSize="25sp"
        android:id="@+id/btnAdd"
        android:onClick="btnadd"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/sub"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:background="#677789"
        android:padding="10dp"
        android:layout_marginTop="5dp"
        android:textColor="#000000"
        android:textSize="25sp"
        android:id="@+id/btnSubtract"
        android:onClick="btnsub"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/mul"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:background="#405163"
        android:padding="10dp"
        android:layout_marginTop="5dp"
        android:textColor="#000000"
        android:textSize="25sp"
        android:id="@+id/btnMultiply"
        android:onClick="btnmul"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/div"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:background="#19E6B1"
        android:padding="10dp"
        android:layout_marginTop="5dp"
        android:textColor="#000000"
        android:id="@+id/btnDivide"
        android:textSize="25sp"
        android:onClick="btndiv"/>

    

</LinearLayout>

mainactivity.java:-

    package com.mycompany.myapp;

import android.app.*;
import android.os.*;
import android.widget.*;
import android.view.View.*;
import android.view.*;

public class MainActivity extends Activity 
{
    
    
    private EditText etn1;  
    private EditText etn2;
    private TextView tvResult;
    private Button btnadd , btnsub , btnmul , btndiv;
    
    
    
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        etn1 = findViewById(R.id.etFirstValue);
        etn2 = findViewById(R.id.etSecondValue);
        tvResult = findViewById(R.id.tvAns);
        
        
        Button btnadd = findViewById(R.id.btnAdd);  
        btnadd.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    
                    int n1 = Integer.parseInt(etn1.getText().toString());
                    int n2 = Integer.parseInt(etn2.getText().toString());

                    int add = n1 + n2;

                    tvResult.setText(String.valueOf(add));
                }
            
        
            
        });
        
        Button btnsub = findViewById(R.id.btnSubtract);  
        btnsub.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    int n1 = Integer.parseInt(etn1.getText().toString());
                    int n2 = Integer.parseInt(etn2.getText().toString());

                    int add = n1 - n2;

                    tvResult.setText(String.valueOf(add));
                }



            });
        Button btnmul = findViewById(R.id.btnMultiply);  
        btnmul.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    int n1 = Integer.parseInt(etn1.getText().toString());
                    int n2 = Integer.parseInt(etn2.getText().toString());

                    int add = n1 * n2;

                    tvResult.setText(String.valueOf(add));
                }



            });
        Button btndiv = findViewById(R.id.btnDivide);  
        btndiv.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    int n1 = Integer.parseInt(etn1.getText().toString());
                    int n2 = Integer.parseInt(etn2.getText().toString());

                    int add = n1 / n2;

                    tvResult.setText(String.valueOf(add));
                }



            });
        
        
        
    

            
        
        

    }

}

但问题是,当我没有在 firstEditText 或 secondEditText 或两者中输入任何值并单击应用程序崩溃的任何按钮并且弹出窗口显示“myapp 不断停止”时。当我不对任何 EditText 设置任何值时,我希望在空白 EditText 上显示类似“请输入一个值”的内容。请帮帮我

【问题讨论】:

标签: java android xml android-studio


【解决方案1】:

您的应用程序正在崩溃,因为当您不输入任何值并点击按钮时,它会尝试将空的 string 解析为 int,这会导致 NumberFormatException 并导致您的应用程序崩溃。 但是,您可以在解析之前先检查您的编辑文本是否为空,如果它们为空,则显示吐司或小吃吧。

使用这个

 String number1 = etn1.getText().toString();
 String number2 = etn2.getText().toString();
 if(number1.isBlank() || number2.isBlank()){
     Toast.makeText(this, "Please enter a value", Toast.LENGTH_LONG).show();
} else {

 int n1 = Integer.parseInt(number1);
 int n2 = Integer.parseInt(number2);

 int add = n1 + n2;

 tvResult.setText(String.valueOf(add));
}

【讨论】:

  • 是的 ypu 是对的,我明白了并修复了它,谢谢你; )
【解决方案2】:

您收到NumberFormatException,因为当您运行时

Integer.parseInt(etn1.getText().toString())

当 EditText 字段没有值时,它返回 ""。 "" 不能转成数字。因此,它会抛出 NumberFormat 异常。

有很多方法可以解决这个问题,但我建议使用Uncle Bobs Clean Code methodology。您可以将每个按钮单击都封装在 try + catch 块中,如下所示:

try{
  n1 = Integer.parseInt(etn1.getText().toString());
}catch(NumberFormatException x) { 
  x.printStackTrace(); 
  n1 = 0;
}

但我建议鉴于此代码将在所有按钮类型中具有多种用途,您将 n 变量移动到全局变量(在代码库的顶部,即 int n1)并生成一个新方法,例如

Private void setNumbers(){
try{
      n1 = Integer.parseInt(etn1.getText().toString());
      n2 = Integer.parseInt(etn2.getText().toString());
    }catch(NumberFormatException x) { 
      x.printStackTrace(); 
      n1 = 0;
      n2 = 0;
    }
}

然后在每个 Button 中的 onClick 侦听器可能如下所示:

btndiv.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                setNumbers();
                int divide = n1 / n2;
                tvResult.setText(String.valueOf(divide));
                } 
            });
    

【讨论】:

  • 是的,你是对的,我明白了,谢谢 :)
【解决方案3】:

问题是您的输入(例如,etn1.getText().toString())可能不是数字。所以你得到 NumberFormatException。 要解决此问题,请像这样重写您的代码:

btnadd.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
int n1 = 0;
int n2 = 0;
try{
  n1 = Integer.parseInt(etn1.getText().toString());
}catch(Exception x) { 
  x.printStackTrace(); 
  n1 = 0;
}

try{
   n2 = Integer.parseInt(etn2.getText().toString());
}catch(Exception x) { 
  x.printStackTrace(); 
  n2 = 0;
}
 
                    int add = n1 + n2;

                    tvResult.setText(String.valueOf(add));
                }
            
        
            
        });

【讨论】:

  • 是的,你的回答是对的,我终于明白了,谢谢:
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 2013-05-15
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多