[英]java.lang.NumberFormatException: empty String in Android
i have to edit text fields and a text view where I have to do a calculation, and display it in the text view automatically using Text Watcher.我必须编辑文本字段和文本视图,我必须在其中进行计算,并使用文本观察器自动将其显示在文本视图中。 But i'm facing an issue with empty string on edit text, when I enter a number in the edit text emulator crashes and the error is:
但是我在编辑文本上遇到了空字符串的问题,当我在编辑文本模拟器中输入一个数字时崩溃并且错误是:
java.lang.NumberFormatException: empty String
I converted Strings to double like below:我将字符串转换为 double ,如下所示:
private void doCalculations() {
String totalOutMekanik = edTotalOutMekanik.getText().toString();
String totalInMekanik = edTotalInMekanik.getText().toString();
// check if the string is empty
if (!totalOutMekanik.isEmpty() && !totalInMekanik.isEmpty()) {
double totOutMek = Double.parseDouble(totalOutMekanik);
double totInMek = Double.parseDouble(totalInMekanik);
double totInOutMek = totInMek - totOutMek;
total_in_out_mekanik.setText(String.valueOf(totInOutMek));
} else {
}
}
and I added an if conditions to check if the strings are null, and my Text Watcher我添加了一个 if 条件来检查字符串是否为空,以及我的文本观察器
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
doCalculations();
}
@Override
public void afterTextChanged(Editable s) {
}
};
edTotalInMekanik.addTextChangedListener(watcher);
edTotalOutMekanik.addTextChangedListener(watcher);
Edit: My full stacktrance:编辑:我的完整堆栈:
2020-01-09 11:17:50.354 8144-8144/al.sqmo E/AndroidRuntime: FATAL EXCEPTION: main
Process: al.sqmo, PID: 8144
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at al.sqmo.Activities.PutWeeklyDatasActivity.doCalculations(PutWeeklyDatasActivity.java:124)
at al.sqmo.Activities.PutWeeklyDatasActivity.access$000(PutWeeklyDatasActivity.java:36)
at al.sqmo.Activities.PutWeeklyDatasActivity$1.onTextChanged(PutWeeklyDatasActivity.java:79)
at android.widget.TextView.sendOnTextChanged(TextView.java:9754)
at android.widget.TextView.handleTextChanged(TextView.java:9851)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:12509)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1263)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:575)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:506)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:36)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:131)
at android.widget.TextView.doKeyDown(TextView.java:7665)
at android.widget.TextView.onKeyDown(TextView.java:7442)
at android.view.KeyEvent.dispatch(KeyEvent.java:2692)
at android.view.View.dispatchKeyEvent(View.java:12450)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.support.v4.widget.NestedScrollView.dispatchKeyEvent(NestedScrollView.java:592)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1896)
at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:428)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1820)
at android.app.Activity.dispatchKeyEvent(Activity.java:3360)
at android.support.v4.app.SupportActivity.superDispatchKeyEvent(ComponentActivity.java:108)
at android.support.v4.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
at android.support.v4.app.SupportActivity.dispatchKeyEvent(ComponentActivity.java:126)
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:535)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
at android.support.v7.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2533)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:342)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5037)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4905)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
2020-01-09 11:17:50.355 8144-8144/al.sqmo E/AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4618)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4779)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2571)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2081)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2072)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2548)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:326)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Kindly do below changes, ie do trimming of string for space.请进行以下更改,即为空间修剪字符串。
String totalOutMekanik = edTotalOutMekanik.getText().toString().trim();
String totalInMekanik = edTotalInMekanik.getText().toString().trim();
If you look official document of the {string}.isEmpty()
then you find just looks length of the string and tells wether it has value or not.如果您查看
{string}.isEmpty()
官方文档,那么您会发现它只是字符串的长度并告诉它是否有价值。 It does not consider spaces.它不考虑空格。 In your case I guess space was causing problem.
在你的情况下,我猜空间造成了问题。
Your are checking for empty for following variable "totalOutMekanik".您正在检查以下变量“totalOutMekanik”是否为空。 Try below code.
试试下面的代码。
private void doCalculations() {
String totalOutMekanik =edTotalOutMekanik.getText().toString().trim();
String totalInMekanik = edTotalInMekanik.getText().toString().trim();
// check if the string is empty
if (!totalOutMekanik.isEmpty() && !totalInMekanik.isEmpty()) {
double totOutMek = Double.parseDouble(totalOutMekanik);
double totInMek = Double.parseDouble(totalInMekanik);
double totInOutMek = totInMek - totOutMek;
total_in_out_mekanik.setText(String.valueOf(totInOutMek));
} else {
}
}
The way you check empty is wrong.你检查空的方式是错误的。 This is function of isEmpty in java:
这是java中isEmpty的函数:
public boolean isEmpty() {
// Android-changed: Get length from count field rather than value array (see above).
// Empty string has {@code count == 0} with or without string compression enabled.
// return value.length == 0;
return count == 0;
}
it's not check null.它不是检查空值。 Fixed it by create a method to check:
通过创建一个检查方法来修复它:
public static boolean isBlank(String myString) {
if (myString == null) return false;
return myString.trim().length() != 0;
}
I sure it's work.我确定这是工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.