簡體   English   中英

當 EditText 為空白並按下按鈕時,Android 應用程序崩潰

[英]Android app crashes when EditText is blank and button pressed

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);

   }
}

當我按下我的應用程序上的“猜測”按鈕時,我的應用程序崩潰了,即使我有線路

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

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

        } 

嘗試捕獲空的 EditText。

我查看了其他 stackOverflow 帖子,但沒有一個可以解決我的錯誤。

這是日志貓:

02-24 20:35:10.645 15999-15999/? I/art: Late-enabling -Xcheck:jni
02-24 20:35:10.683 15999-15999/com.davidcleary.numberguesser            W/ResourceType: Found multiple library tables, ignoring...
02-24 20:35:10.784 15999-16028/com.davidcleary.numberguesser     D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
02-24 20:35:10.790 15999-15999/com.davidcleary.numberguesser D/Atlas:    Validating map...
02-24 20:35:10.849 15999-16028/com.davidcleary.numberguesser I/Adreno-  EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:   AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.01.00.042.030_msm8974_LA.BF.1.1.1_RB1__    release_AU ()
                                                                           OpenGL ES Shader Compiler Version: E031.25.03.06
                                                                          Build Date: 07/13/15 Mon
                                                                          Local Branch: mybranch11906725
                                                                         Remote Branch: quic/LA.BF.1.1.1_rb1.26
                                                                        Local Patches: NONE
                                                                        Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.01.00.042.030 +  6151be1 + a1e0343 + 002d7d6 + 7d0e3f7 +  NOTHING
02-24 20:35:10.850 15999-16028/com.davidcleary.numberguesser    I/OpenGLRenderer: Initialized EGL, version 1.4
02-24 20:35:10.866 15999-16028/com.davidcleary.numberguesser    D/OpenGLRenderer: Enabling debug mode 0
02-24 20:35:10.937 15999-15999/com.davidcleary.numberguesser   I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@23edbb88    time:9305943
02-24 20:35:14.498 15999-15999/com.davidcleary.numberguesser     D/AndroidRuntime: Shutting down VM
02-24 20:35:14.501 15999-15999/com.davidcleary.numberguesser     E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.davidcleary.numberguesser, PID: 15999
                                                                               java.lang.IllegalStateException: Could not execute method for     android:onClick
                                                                                    at     android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClic     k(AppCompatViewInflater.java:275)
                                                                                   at android.view.View.performClick(View.java:4856)
                                                                                     at android.view.View$PerformClick.run(View.java:19956)
                                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:211)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5373)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
                                                                            Caused by: java.lang.reflect.InvocationTargetException
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
                                                                               at android.view.View.performClick(View.java:4856) 
                                                                               at android.view.View$PerformClick.run(View.java:19956) 
                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                               at android.os.Looper.loop(Looper.java:211) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5373) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
                                                                            Caused by: java.lang.NumberFormatException: Invalid int: ""
                                                                               at java.lang.Integer.invalidInt(Integer.java:138)
                                                                               at java.lang.Integer.parseInt(Integer.java:358)
                                                                               at java.lang.Integer.parseInt(Integer.java:334)
                                                                               at java.lang.Integer.<init>(Integer.java:102)
                                                                               at com.davidcleary.numberguesser.MainActivity.randomGenerator(MainActivity.java:22)
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
                                                                               at android.view.View.performClick(View.java:4856) 
                                                                               at android.view.View$PerformClick.run(View.java:19956) 
                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                               at android.os.Looper.loop(Looper.java:211) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5373) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 

替換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;
}

您應該在此行之前檢查空字符串:

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;
}

由於 editText,您的應用程序崩潰。 在這里,您嘗試將 editText 的 String 值更改為 int 以與隨機數進行比較。

例如:

editText 中的字符串值 =[number] ---轉換為 int--> [成功]

editText 中的字符串值 =[empty/null,alphabets] ---轉換為 int--> [錯誤]

所以通過 try Catch [Solution below] 來處理這個問題

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;
        }

這是您的答案的解決方案。

我認為您正在制作一個猜數字應用程序。 你的代碼太復雜了,你可以讓這段代碼變得簡單、小巧和高級(用戶嘗試猜測多少次)

最佳實踐你的完整解決方案在這里:(這里導入的是最新的 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
    }

}

謝謝 !! 快樂編碼:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM