【问题标题】:java.lang.NumberFormatException: Invalid int: "" EXCEPTIONjava.lang.NumberFormatException:无效的int:“”异常
【发布时间】:2019-07-19 16:17:30
【问题描述】:

如果用户将 edittext 留空,则会发生错误 java.lang.NumberFormatException: Invalid int: ""。 错误出现在一行

 if (a=="" && b=="")

还有一线

 int result = Integer.parseInt(a) + Integer.parseInt(b);
 t1.setText(Integer.toString(result));

Calci.java

package com.example.calculator;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Calci extends Activity {
    TextView t1;
    EditText e1, e2;
    Button add, sub, mul, div;
    Context c=this;

    String b, a;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calci);
        e1 = (EditText) findViewById(R.id.EditText01);
        e2 = (EditText) findViewById(R.id.EditText02);
        add = (Button) findViewById(R.id.add);
        sub = (Button) findViewById(R.id.sub);
        mul = (Button) findViewById(R.id.mul);
        div = (Button) findViewById(R.id.div);
        t1 = (TextView) findViewById(R.id.textView1);
        a = e1.getText().toString();
        b = e2.getText().toString();
add.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        if (a=="" && b==""){
                AlertDialog.Builder a1 = new AlertDialog.Builder(c);


                // Setting Dialog Title
                a1.setTitle("Alert Dialog");

                // Setting Dialog Message
                a1.setMessage("PLEASE ENTER SOMETHING");

                a1.setPositiveButton("yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int button1) {
                                // if this button is clicked, close
                                // current activity
                                dialog.cancel();
                            }

                        });

                // Showing Alert Message
                AlertDialog alertDialog = a1.create();
                a1.show();

            }

        else{
            int result = Integer.parseInt(a) + Integer.parseInt(b);
            t1.setText(Integer.toString(result));
            InputMethodManager imm = (InputMethodManager)getSystemService(
                      Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(add.getWindowToken(), 0);
        }

    }

});
    }
}

LogCat:

03-19 15:42:21.165: E/Trace(25381): error opening trace file: Permission denied (13)
03-19 15:42:21.165: D/ActivityThread(25381): setTargetHeapUtilization:0.25
03-19 15:42:21.165: D/ActivityThread(25381): setTargetHeapIdealFree:8388608
03-19 15:42:21.165: D/ActivityThread(25381): setTargetHeapConcurrentStart:2097152
03-19 15:42:21.385: D/libEGL(25381): loaded /system/lib/egl/libEGL_adreno200.so
03-19 15:42:21.465: D/libEGL(25381): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
03-19 15:42:21.475: D/libEGL(25381): loaded /system/lib/egl/libGLESv2_adreno200.so
03-19 15:42:21.475: I/Adreno200-EGL(25381): <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build:  (Merge)
03-19 15:42:21.475: I/Adreno200-EGL(25381): Build Date: 07/09/13 Tue
03-19 15:42:21.475: I/Adreno200-EGL(25381): Local Branch: AU_41
03-19 15:42:21.475: I/Adreno200-EGL(25381): Remote Branch: 
03-19 15:42:21.475: I/Adreno200-EGL(25381): Local Patches: 
03-19 15:42:21.475: I/Adreno200-EGL(25381): Reconstruct Branch: 
03-19 15:42:21.675: D/OpenGLRenderer(25381): Enabling debug mode 0
03-19 15:42:24.325: D/AndroidRuntime(25381): Shutting down VM
03-19 15:42:24.325: W/dalvikvm(25381): threadid=1: thread exiting with uncaught exception (group=0x41972378)
03-19 15:42:24.395: E/AndroidRuntime(25381): FATAL EXCEPTION: main
03-19 15:42:24.395: E/AndroidRuntime(25381): java.lang.NumberFormatException: Invalid int: ""
03-19 15:42:24.395: E/AndroidRuntime(25381):    at java.lang.Integer.invalidInt(Integer.java:138)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at java.lang.Integer.parseInt(Integer.java:359)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at java.lang.Integer.parseInt(Integer.java:332)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at com.example.calculator.Calci$1.onClick(Calci.java:67)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.view.View.performClick(View.java:4147)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.view.View$PerformClick.run(View.java:17161)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.os.Handler.handleCallback(Handler.java:615)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.os.Looper.loop(Looper.java:213)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at android.app.ActivityThread.main(ActivityThread.java:4787)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at java.lang.reflect.Method.invokeNative(Native Method)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at java.lang.reflect.Method.invoke(Method.java:511)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
03-19 15:42:24.395: E/AndroidRuntime(25381):    at dalvik.system.NativeStart.main(Native Method)
03-19 15:42:25.685: I/Process(25381): Sending signal. PID: 25381 SIG: 9

任何人都知道如何解决这些堆栈跟踪错误。

【问题讨论】:

  • 您必须在 onclick 方法中获取 a、b 值..before 它只会是“”..
  • 将 if (a=="" && b=="") 更改为 if (a.length()==0 || b.length()==0) 警报应该是上升事件 a 为空或 b 为空
  • @VinhNT 不应该进行检查.. 如果该edittext 填充了空格或其他字符?将发生相同的数字格式异常。如果用户将编辑文本留空,则此检查是可以的。
  • @Antony,好吧,我看到了你的意见,所以,这种情况下最好的方法是尝试捕获 parse 方法,如果出现任何异常,通知用户她/他的错误数据,否则, 只需接受数字

标签: android exception


【解决方案1】:

使用以下。

 a = e1.getText().toString().trim();    
 b = e2.getText().toString().trim(); 
 if (a.equals("") && b.equals("") ){

 }

【讨论】:

    【解决方案2】:

    如果我们使用.equals(),仍然有机会NumberFormatException,因为如果用户输入空格或特殊字符会出现异常。像这样更改您的代码..

    @Override
    public void onClick(View arg0) {
    try{
            a = e1.getText().toString();
            b = e2.getText().toString();
            int result = Integer.parseInt(a) + Integer.parseInt(b);
            t1.setText(Integer.toString(result));
            InputMethodManager imm = (InputMethodManager)getSystemService(
                      Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(add.getWindowToken(), 0);
        }
     catch(NumberFormatException e)
       {
         AlertDialog.Builder a1 = new AlertDialog.Builder(c);
    
    
                // Setting Dialog Title
                a1.setTitle("Alert Dialog");
    
                // Setting Dialog Message
                a1.setMessage("Filed is Empty or Invalid Number");
    
                a1.setPositiveButton("yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int button1) {
                                // if this button is clicked, close
                                // current activity
                                dialog.cancel();
                            }
    
                        });
    
                // Showing Alert Message
                AlertDialog alertDialog = a1.create();
                a1.show();
      }
      }
    
      });
    

    【讨论】:

      【解决方案3】:
      if (a=="" && b=="")
      

      不要使用== 进行字符串比较。见How do I compare strings in Java?

      NumberFormatException

      由于您正在解析用户提供的输入,因此您应该捕获异常并相应地处理解析错误。

      【讨论】:

        【解决方案4】:

        您正在将编辑文本的值转换为代码中的字符串,如下所示

        a = e1.getText().toString();
        b = e2.getText().toString();
        

        所以你必须使用

        a.equals("") && b.equals("")
        

        而不是

        a=="" && b==""
        

        还有一件事你必须改变的是,这条线

        AlertDialog.Builder a1 = new AlertDialog.Builder(c);
        

        与

        AlertDialog.Builder a1 = new AlertDialog.Builder(Calci.this);
        

        【讨论】:

        • 仍然有可能出现 NumberFormatException,因为如果用户输入空格或特殊字符会出现异常。
        【解决方案5】:

        对于部分:

         int result = Integer.parseInt(a) + Integer.parseInt(b);
                t1.setText(Integer.toString(result));
        

        试试这个:

        int result = Integer.valueOf(a) + Integer.valueOf(b);
                t1.setText(Integer.toString(result));
        

        前段时间,这帮助我解决了一个非常相似的问题

        【讨论】:

          【解决方案6】:

          请进行如下更改,

              add.setOnClickListener(new View.OnClickListener() {
          
          @Override
          public void onClick(View arg0) {
               if (a.equals("") && b.equals("") )
           {
                      AlertDialog.Builder a1 = new AlertDialog.Builder(c);
          
          
                      // Setting Dialog Title
                      a1.setTitle("Alert Dialog");
          
                      // Setting Dialog Message
                      a1.setMessage("PLEASE ENTER SOMETHING");
          
                      a1.setPositiveButton("yes",
                              new DialogInterface.OnClickListener() {
                                  public void onClick(DialogInterface dialog,
                                          int button1) {
                                      // if this button is clicked, close
                                      // current activity
                                      dialog.cancel();
                                  }
          
                              });
          
                      // Showing Alert Message
                      AlertDialog alertDialog = a1.create();
                      a1.show();
          
                  }
          
              else{
                  int result = Integer.parseInt(a) + Integer.parseInt(b);
                  t1.setText(""+result);
                  InputMethodManager imm = (InputMethodManager)getSystemService(
                            Context.INPUT_METHOD_SERVICE);
                      imm.hideSoftInputFromWindow(add.getWindowToken(), 0);
              }
          
          }
          

          });

          【讨论】:

          • 仍然有可能出现 NumberFormatException,因为如果用户输入空格或特殊字符会出现异常。
          • 他们只会做算术运算
          • 您不能告诉应用用户“只输入数字”。用户可以输入任何内容。所以我们必须处理所有可能的异常
          • 我可以通过检查 isdigit() 来处理
          • isDigit() 只接受 char 输入,因为我们的输入是 String :) 请看看我的答案。这是非常安全的方式
          【解决方案7】:

          首先,您不应该使用== 运算符比较字符串值,而应该使用String 类中的equals() 方法。

          下一个更改。

          public void onClick(View arg0) 
          {
              // First fetch the values of a & b here instead of onCreate() method
                a = e1.getText().toString().trim();    // trim() method will remove any white spaces
                b = e2.getText().toString().trim(); 
               if (a.equals("") && b.equals("") )
               {
              ....
          

          更改上述内容,您的代码应该可以完美运行。

          【讨论】:

          • 仍然有可能出现 NumberFormatException,因为如果用户输入空格或特殊字符会出现异常。
          • @CodeError,这个问题现在被删除了。
          • @Kedarnath Sir:对不起,我的错误应该是stackoverflow.com/questions/22602559/…
          • @CodeError, 你想创建一个锁类的应用程序吗?
          【解决方案8】:

          这个问题具有误导性,它是关于整数的大小,因为 java int 是:2^32-1,你的整数可以是 10 位日志,例如:0123456789。 但是如果整数是 11 位,例如:0123456789***1***。那么你需要使用BigInteger,见:https://developer.android.com/reference/java/math/BigInteger.html

          【讨论】:

            【解决方案9】:

            这可能有点晚了,但我相信它会帮助将来的人。

            你必须在 onclick 中嵌套字符串 a 和 b。我在我的上做了这个并且无缝地工作。

            【讨论】:

              【解决方案10】:

              如果您使用 EditText 并期望用户提供整数值,那么最好的方法是在 EditText xml 文件中使用 inputType 属性。

              android:inputType="numberDecimal"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-29
                • 2016-02-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-03-16
                相关资源
                最近更新 更多