【问题标题】:App crash when clearing EditText in Android Studio在 Android Studio 中清除 EditText 时应用程序崩溃
【发布时间】:2017-12-28 06:32:54
【问题描述】:

我尝试创建一个猜数游戏,我设置了一个数字范围并编辑文本供用户输入数字。我尝试输入,例如“50”,但当我尝试删除时,我只能删除“0”。如果我继续删除数字“5”,应用程序就会崩溃。这是我的 MainActivity 代码:

import java.util.Random;

public class MainActivity extends AppCompatActivity {
  TextView textViewChoice, textViewStatus;
  EditText editTextNum ;

Button buttonSetting;
SharedPreferences preferences;

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

    textViewChoice = (TextView) findViewById(R.id.textViewChoice);
    textViewStatus =(TextView) findViewById(R.id.textviewStatus);
    editTextNum = (EditText) findViewById(R.id.edittextGuess);

    buttonSetting =(Button) findViewById(R.id.buttonSetting);
    preferences = getSharedPreferences("LIMITS",MODE_PRIVATE);




    buttonSetting.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);
            startActivity(intent);
        }
    });
}

@Override
protected void onStart() {
    super.onStart();
    final int MinNumber = preferences.getInt("Seekbar Min", 0);
    final int MaxNumber = preferences.getInt("Seekbar Max", 0);
    textViewChoice.setText("" + MinNumber + "-" + MaxNumber);

    editTextNum.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            Random random = new Random();
            int RanNum = random.nextInt(MaxNumber-MinNumber)+MinNumber;
            String StringEditNum= editTextNum.getText().toString();
            int EditNum = Integer.parseInt(StringEditNum);
            if (EditNum >RanNum){
                textViewStatus.setText("Enter Higher Number");
            }
            else if(EditNum <RanNum){
                textViewStatus.setText("Enter Lower Numer!");


            }
            else if (StringEditNum.equals("")){
                Toast.makeText(MainActivity.this,"Error!",Toast.LENGTH_SHORT).show();
            }
            else {
                textViewStatus.setText("You won! You Nutz!");
            }

        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

}

@Override
protected void onStop() {
    super.onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
}
}

调试后我得到了这个:

E/AndroidRuntime: 致命异常: main 进程:com.example.user.ggame,PID:3291 java.lang.NumberFormatException:对于输入字符串:“” 在 java.lang.Integer.parseInt(Integer.java:620) 在 java.lang.Integer.parseInt(Integer.java:643) 在 com.example.user.ggame.MainActivity$2.onTextChanged(MainActivity.java:71) 在 android.widget.TextView.sendOnTextChanged(TextView.java:9359) 在 android.widget.TextView.handleTextChanged(TextView.java:9446) 在 android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:11904) 在 android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1252) 在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:573) 在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:229) 在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:227) 在 android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:370) 在 android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:71) 在 android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:479) 在 android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:148) 在 android.widget.TextView.doKeyDown(TextView.java:7316) 在 android.widget.TextView.onKeyDown(TextView.java:7093) 在 android.view.KeyEvent.dispatch(KeyEvent.java:2688) 在 android.view.View.dispatchKeyEvent(View.java:11662) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1827) 在 com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:437) 在 com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1818) 在 android.app.Activity.dispatchKeyEvent(Activity.java:3252) 在 android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:534) 在 android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:58) 在 android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:316) 在 com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:351) 在 android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4714) 在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4586) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4274) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155) 在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4331) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4307) 在 android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4468) 在 android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2435) 在 android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1998) E/AndroidRuntime:在 android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1989) 在 android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2412) 在 android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 在 android.os.MessageQueue.nativePollOnce(本机方法) 在 android.os.MessageQueue.next(MessageQueue.java:325) 在 android.os.Looper.loop(Looper.java:142) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

标签: android


【解决方案1】:

您的问题在这一行:

 String StringEditNum= editTextNum.getText().toString();
 int EditNum = Integer.parseInt(StringEditNum);

在清除5 时,StringEditNum 的值将是空字符串,您无法解析空字符串,因此它会崩溃

尝试添加这个:

String StringEditNum= editTextNum.getText().toString();
int EditNum = 0;
if(!StringEditNum.equals("")){
   EditNum = Integer.parseInt(StringEditNum);
}

【讨论】:

    【解决方案2】:

    试试下面的代码

       Random random = new Random();
       int RanNum = random.nextInt(MaxNumber-MinNumber)+MinNumber;
       String StringEditNum= editTextNum.getText().toString();
        if(!StringEditNum.equals("")){
            int EditNum = Integer.parseInt(StringEditNum);
            if (EditNum >RanNum){
                textViewStatus.setText("Enter Higher Number");
            }else if(EditNum <RanNum){
                textViewStatus.setText("Enter Lower Numer!");
            }else {
                textViewStatus.setText("You won! You Nutz!");
            }
        } else{
                Toast.makeText(MainActivity.this,"Try again!",Toast.LENGTH_SHORT).show();
            }
    

    【讨论】:

    【解决方案3】:

    检查下面的代码。

    editTextNum.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
          if(editTextNum.getText().toString().length() > 0)
          {
            Random random = new Random();
            int RanNum = random.nextInt(MaxNumber-MinNumber)+MinNumber;
            String StringEditNum= editTextNum.getText().toString();
            int EditNum = Integer.parseInt(StringEditNum);
            if (EditNum >RanNum){
                textViewStatus.setText("Enter Higher Number");
            }
            else if(EditNum <RanNum){
                textViewStatus.setText("Enter Lower Numer!");
            }
            else if (StringEditNum.equals("")){
                Toast.makeText(MainActivity.this,"Error!",Toast.LENGTH_SHORT).show();
            }
            else {
                textViewStatus.setText("You won! You Nutz!");
            }
          }
        }
    
        @Override
        public void afterTextChanged(Editable editable) {
    
        }
    });
    

    【讨论】:

      【解决方案4】:

      试试这个

      1. 这将产生java.lang.IllegalArgumentException: n &lt;= 0: 0,因为bound 应该是random.nextInt(bound) 0

           Random random = new Random();
           int RanNum = random.nextInt(MaxNumber-MinNumber)+MinNumber;
        
           try this
        
            Random random = new Random();
            int RanNum = random.nextInt((MaxNumber-MinNumber)+1);
        

      2.String转换为整数时不能为null

          @Override
          public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      
              Random random = new Random();
              int RanNum = random.nextInt((MaxNumber-MinNumber)+1);
              String StringEditNum= editTextNum.getText().toString();
                  if (!TextUtils.isEmpty(editTextNum.getText().toString()))
                  {
                      int EditNum = Integer.parseInt(StringEditNum);
                      if (EditNum >RanNum){
                          textViewStatus.setText("Enter Higher Number");
                      }
                      else if(EditNum <RanNum){
                          textViewStatus.setText("Enter Lower Numer!");
      
      
                      }
                      else if (StringEditNum.equals("")){
                          Toast.makeText(MainActivity.this,"Error!",Toast.LENGTH_SHORT).show();
                      }
                      else {
                          textViewStatus.setText("You won! You Nutz!");
                      }
                  }else {
      
                  }            
      
          }
      

      【讨论】:

        【解决方案5】:

        在将其转换为 int

        之前检查 StringEditNum 不为空或为空
            if(!StringEditNum.equalsIgnoreCase("")){
        
                    int EditNum = Integer.parseInt(StringEditNum);
        
            }
        

        【讨论】:

          【解决方案6】:

          问题是您正在使用 textWatcher 侦听器,并且每当您编写/删除某些内容时,都会调用此侦听器。现在,当你写数字 50 时,你写 5 和 0。然后当你删除它时,你首先删除 0,留下 5。在这种情况下,下面的行是好的

          int EditNum = Integer.parseInt(StringEditNum);
          

          但是当你删除 5 时,StringEditNum 变为 "" 并且上面的行会导致 java.lang.NumberFormatException。所以请检查下面的代码以使其完美运行

          import java.util.Random;
          
          public class MainActivity extends AppCompatActivity {
          TextView textViewChoice, textViewStatus;
          EditText editTextNum ;
          
          Button buttonSetting;
          SharedPreferences preferences;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          
          textViewChoice = (TextView) findViewById(R.id.textViewChoice);
          textViewStatus =(TextView) findViewById(R.id.textviewStatus);
          editTextNum = (EditText) findViewById(R.id.edittextGuess);
          
          buttonSetting =(Button) findViewById(R.id.buttonSetting);
          preferences = getSharedPreferences("LIMITS",MODE_PRIVATE);
          
          
          
          
            buttonSetting.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Intent intent = new Intent(MainActivity.this,        SecondaryActivity.class);
                  startActivity(intent);
              }
          });
          }
          
          @Override
          protected void onStart() {
          super.onStart();
          final int MinNumber = preferences.getInt("Seekbar Min", 0);
          final int MaxNumber = preferences.getInt("Seekbar Max", 0);
          textViewChoice.setText("" + MinNumber + "-" + MaxNumber);
          
          editTextNum.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
          
              }
          
              @Override
              public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                  Random random = new Random();
                  int RanNum = random.nextInt(MaxNumber-MinNumber)+MinNumber;
                  String StringEditNum= editTextNum.getText().toString();
                  if(!StringEditNum.equals("")){
                  int EditNum = Integer.parseInt(StringEditNum);
                  if (EditNum >RanNum){
                      textViewStatus.setText("Enter Higher Number");
                  }
                  else if(EditNum <RanNum){
                      textViewStatus.setText("Enter Lower Numer!");
          
          
                  }
          
                  else {
                      textViewStatus.setText("You won! You Nutz!");
                  }
              }else{
                    Toast.makeText(MainActivity.this,"Error!",Toast.LENGTH_SHORT).show();
              }
           }
              @Override
              public void afterTextChanged(Editable editable) {
          
              }
          });
          
          }
          
          @Override
          protected void onStop() {
          super.onStop();
          }
          
          @Override
          protected void onDestroy() {
          super.onDestroy();
          }
          }
          

          【讨论】:

            猜你喜欢
            • 2021-06-12
            • 1970-01-01
            • 2011-08-26
            • 2015-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多