[英]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.