当EditText为空并按下按钮时,Android应用程序崩溃

时间:2016-02-24 21:24:02

标签: java android

li:nth-of-type(3)

即使我有行

,当我按下应用程序上的“猜测”按钮时,我的应用程序崩溃了
package com.davidcleary.numberguesser;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

int randomNumber;
Random randNum = new Random();

public void randomGenerator(View view) {

    boolean isRight = false;

    EditText guess = (EditText) findViewById(R.id.guessText);
    String myGuess = guess.getText().toString();

    int guessInt = new Integer(guess.getText().toString());

        if (guess.getText().toString().equals("")) {

            Toast.makeText(getApplicationContext(), "Please Enter A Guess!", Toast.LENGTH_SHORT).show();

        } else if (guessInt == randomNumber) {

            Toast.makeText(getApplicationContext(), "You Guessed The Right Number!!! " + "( " + guessInt + " )", Toast.LENGTH_LONG).show();
            guess.setText("");
            randomNumber = randNum.nextInt(21);

        } else if (guessInt > randomNumber) {

            Toast.makeText(getApplicationContext(), "Your Guess Is Too High! " + "( " + guessInt + " )", Toast.LENGTH_SHORT).show();
            guess.setText("");


        } else {

            Toast.makeText(getApplicationContext(), "Your Guess Is Too Low! " + "( " + guessInt + " )", Toast.LENGTH_SHORT).show();
            guess.setText("");


        }
    }


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

    randomNumber = randNum.nextInt(21);

   }
}

尝试捕获空的EditText。

我查看了其他stackOverflow帖子但没有一个可以解决我的错误。

这是logcat:

if (guess.getText().toString().equals("")) {

            Toast.makeText(getApplicationContext(), "Please Enter A Guess!", Toast.LENGTH_SHORT).show();

        } 

3 个答案:

答案 0 :(得分:3)

int guessInt = new Integer(guess.getText().toString());替换为

int guessInt;
try {
    guessInt = Integer.parseInt(myGuess);
}
catch(NumberFormatException ex) {
  //They didn't enter a number.  Pop up a toast or warn them in some other way
  return;
}

答案 1 :(得分:1)

您应该在此行之前检查空白字符串:

int guessInt = new Integer(guess.getText().toString());

new Integer()提供空字符串会导致您的应用崩溃。

只需将代码更改为:

if (guess.getText().toString().equals("")) {
    Toast.makeText(getApplicationContext(), "Please Enter A Guess!", Toast.LENGTH_SHORT).show();
    return;
}

int guessInt = new Integer(guess.getText().toString());

if (guessInt == randomNumber) {

尝试检测非数字值也是一种好习惯。您可以通过try / catch包围new Integer()行来完成此操作。

例如:

int guessInt;
try{
    guessInt = new Integer(guess.getText().toString());
} catch {
    Toast.makeText(getApplicationContext(), "Please Enter A Valid Guess!", Toast.LENGTH_SHORT).show();
    return;
}

答案 2 :(得分:0)

由于editText,您的应用程序崩溃。在这里,您尝试将editText的String值更改为int以便与随机数进行比较。

例如:

editText中的字符串值= [数字] ---转换为int-> [成功]

editText中的字符串值= [empty / null,alphabets] ---转换为int-> [错误]

因此,请尝试捕获[以下解决方案]

EditText guess = findViewById(R.id.guessText);
int guessValue;

        try {
            guessValue = Integer.parseInt(guess.getText().toString()); // best way to convert String into int
        } catch (Exception e)
        {
                    // Exception e  for handle all type of Exceptions
            Toast.makeText(getApplicationContext(),"Enter a Valid Number",Toast.LENGTH_LONG).show();
            return;
        }

这是您答案的解决方案。

我认为您正在制作Number Guess应用。您的代码太复杂了,您可以使它变得简单,小巧和高级(用户尝试猜测多少次)

此处为最佳做法的完整解决方案:(此处为最新支持的Androidx导入)

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {
    int randomNumber;
    int guessLimit=20; // for set limit 1 to 20
    int guessTry; // how many time user try

    public void generateRandomNumber() {

        Random rand = new Random();
        randomNumber = rand.nextInt(guessLimit) + 1;
        guessTry=0; // after Right Answer you Guess try will be zero 

    }

    public void randomGenerator(View view) {

        EditText editText = (EditText) findViewById(R.id.guessText);


        int guessValue;
        //Try-Catch for handle Error of ediText
        try {
            guessValue = Integer.parseInt(editText.getText().toString();); //convert editText value into int
        }catch (Exception e)
        {
            Toast.makeText(getApplicationContext(),"Enter a Valid Number",Toast.LENGTH_LONG).show();
            return;
        }

        if (guessValue>0 && guessValue <guessLimit+1) { //Check if entre number is bigger or lower then Guess Limit

            if (guessValue > randomNumber) {
                guessTry++; // increase guess try every time
               Toast.makeText(getApplicationContext(),"Lower!" + " [Try=" + guessTry + "]" , Toast.LENGTH_SHORT).show();

            } else if (guessValue < randomNumber) {
                guessTry++;
                Toast.makeText(getApplicationContext(),"Higher!" + " [Try=" + guessTry + "]" , Toast.LENGTH_SHORT).show();

            } else {
                guessTry++;
                Toast.makeText(getApplicationContext(),"Hurry You Got it" + "[Ans=>"
                        + randomNumber + "]" + "  [Try=" + guessTry + "]" , Toast.LENGTH_SHORT).show();
                generateRandomNumber(); //after Success , create new random number

            }
        } else { //if values are not between your provided guess limit
       Toast.makeText(getApplicationContext(),"Entre Guess value between 1 to "+guessLimit,Toast.LENGTH_SHORT).show();
     }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        generateRandomNumber(); // for call method of random number generater
    }

}

谢谢!快乐编码:)