处理 Blanked EditText 和 EditText With Character 的异常?(最好深入了解)
Handle exception of Blanked EditText and EditText With Character?(better get in disrciption)
我创建了一个将货币从美元转换为卢比的应用程序。当我输入美元金额时,它会在按 button
后转换为卢比。 Variable
类型的结果金额是 double
。现在,如果我在 The EditText 而不是 Number 中输入 character
,然后按 button
,应用程序就会崩溃。当我将 EditText 保持空白并按下 button
时,同样的事情发生了。很明显,我们无法将字符转换为 double
即卢比。现在如何通过保持应用程序不崩溃来处理这些 Run Time Errors
。我试图搜索类似的问题,但对此并不满意。 (如果需要,请向我询问有关问题的额外信息)。
ActivityMain.java
package com.example.admin.convertcurrency;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;
import java.util.InputMismatchException;
public class MainActivity extends AppCompatActivity {
public void ButtonClicked(View view) {
EditText EnteredAmount = (EditText) findViewById(R.id.EnteredAmount);
Log.i("Amount Entered", EnteredAmount.getText().toString());
Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
Double Rupees = ConvertedAmount * 71.64;
Log.i("Converted Amount", String.valueOf(Rupees));
Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Please Enter The Number Instead..!", Toast.LENGTH_SHORT).show();
}
LogCat Error Log(After typed Single "A" character in EditText)
09-09 20:30:54.415 30894-30894/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.convertcurrency, PID: 30894
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.NumberFormatException: Invalid double: "a"
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.initialParse(StringToReal.java:164)
at java.lang.StringToReal.parseDouble(StringToReal.java:282)
at java.lang.Double.parseDouble(Double.java:301)
at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:44)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
LogCat Error Log(After keeping the EditText as blank)
09-09 19:00:44.031 8951-8951/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.convertcurrency, PID: 8951
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.NumberFormatException: Invalid double: ""
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.parseDouble(StringToReal.java:267)
at java.lang.Double.parseDouble(Double.java:301)
at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:23)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
为了防止在您的输入中输入十进制数字以外的任何内容,请将以下 属性 添加到 XML 中的 EditText:
android:inputType="numberDecimal"
为防止您的应用在进行转换时崩溃,请检查输入的长度是否大于 0:
String enteredAmount = EnteredAmount.getText().toString();
if (enteredAmount.length > 0) {
Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
Double Rupees = ConvertedAmount * 71.64;
Log.i("Converted Amount", String.valueOf(Rupees));
Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();
} else {
//do nothing or notify the user that the input can't be empty"
}
1- 您需要强制键盘只显示数字,这可以通过在 EditText
XML[=26= 中使用 inputType
来完成] :
android:inputType="numberDecimal"
2-你需要处理空字符串的情况(空白输入)
if(EnteredAmount.getText().toString().isEmpty()){
Toast.makeText(MainActivity.this, "you must enter a value to converted",
Toast.LENGTH_SHORT).show();
}
3- 为确保用户不会复制 EditText
中的字符,您可以为此创建一个简单的方法:
private boolean containsChar(String input){
return input.contains("A-Za-z ");
// you can add any special chars need to avoid after A-Za-z for example A-Za-z+-*/
}
因此您的最终 onClick 可以像那样
String s = EnteredAmount.getText().toString();
if(s.isEmpty()){
Toast.makeText(MainActivity.this, "you must enter a value to converted",
Toast.LENGTH_SHORT).show();
}else if(containsChar(s)){
Toast.makeText(MainActivity.this, "can't contain chars",
Toast.LENGTH_SHORT).show();
}else{
// do operation here
}
我创建了一个将货币从美元转换为卢比的应用程序。当我输入美元金额时,它会在按 button
后转换为卢比。 Variable
类型的结果金额是 double
。现在,如果我在 The EditText 而不是 Number 中输入 character
,然后按 button
,应用程序就会崩溃。当我将 EditText 保持空白并按下 button
时,同样的事情发生了。很明显,我们无法将字符转换为 double
即卢比。现在如何通过保持应用程序不崩溃来处理这些 Run Time Errors
。我试图搜索类似的问题,但对此并不满意。 (如果需要,请向我询问有关问题的额外信息)。
ActivityMain.java
package com.example.admin.convertcurrency;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;
import java.util.InputMismatchException;
public class MainActivity extends AppCompatActivity {
public void ButtonClicked(View view) {
EditText EnteredAmount = (EditText) findViewById(R.id.EnteredAmount);
Log.i("Amount Entered", EnteredAmount.getText().toString());
Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
Double Rupees = ConvertedAmount * 71.64;
Log.i("Converted Amount", String.valueOf(Rupees));
Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Please Enter The Number Instead..!", Toast.LENGTH_SHORT).show();
}
LogCat Error Log(After typed Single "A" character in EditText)
09-09 20:30:54.415 30894-30894/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.convertcurrency, PID: 30894
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.NumberFormatException: Invalid double: "a"
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.initialParse(StringToReal.java:164)
at java.lang.StringToReal.parseDouble(StringToReal.java:282)
at java.lang.Double.parseDouble(Double.java:301)
at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:44)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
LogCat Error Log(After keeping the EditText as blank)
09-09 19:00:44.031 8951-8951/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.convertcurrency, PID: 8951
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Caused by: java.lang.NumberFormatException: Invalid double: ""
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.parseDouble(StringToReal.java:267)
at java.lang.Double.parseDouble(Double.java:301)
at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:23)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:5215)
at android.view.View$PerformClick.run(View.java:21196)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
为了防止在您的输入中输入十进制数字以外的任何内容,请将以下 属性 添加到 XML 中的 EditText:
android:inputType="numberDecimal"
为防止您的应用在进行转换时崩溃,请检查输入的长度是否大于 0:
String enteredAmount = EnteredAmount.getText().toString();
if (enteredAmount.length > 0) {
Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
Double Rupees = ConvertedAmount * 71.64;
Log.i("Converted Amount", String.valueOf(Rupees));
Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();
} else {
//do nothing or notify the user that the input can't be empty"
}
1- 您需要强制键盘只显示数字,这可以通过在 EditText
XML[=26= 中使用 inputType
来完成] :
android:inputType="numberDecimal"
2-你需要处理空字符串的情况(空白输入)
if(EnteredAmount.getText().toString().isEmpty()){
Toast.makeText(MainActivity.this, "you must enter a value to converted",
Toast.LENGTH_SHORT).show();
}
3- 为确保用户不会复制 EditText
中的字符,您可以为此创建一个简单的方法:
private boolean containsChar(String input){
return input.contains("A-Za-z ");
// you can add any special chars need to avoid after A-Za-z for example A-Za-z+-*/
}
因此您的最终 onClick 可以像那样
String s = EnteredAmount.getText().toString();
if(s.isEmpty()){
Toast.makeText(MainActivity.this, "you must enter a value to converted",
Toast.LENGTH_SHORT).show();
}else if(containsChar(s)){
Toast.makeText(MainActivity.this, "can't contain chars",
Toast.LENGTH_SHORT).show();
}else{
// do operation here
}