java.lang.NumberFormatException:Android 中的空字符串
java.lang.NumberFormatException: empty String in Android
我必须编辑文本字段和文本视图,我必须在其中进行计算,并使用 Text Watcher 自动将其显示在文本视图中。但是我在编辑文本时遇到空字符串问题,当我在编辑文本模拟器中输入数字时崩溃并且错误是:
java.lang.NumberFormatException: empty String
我将字符串转换为 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 {
}
}
并且我添加了一个 if 条件来检查字符串是否为空,以及我的 Text Watcher
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);
编辑:
我的完整 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[=15=]0(PutWeeklyDatasActivity.java:36)
at al.sqmo.Activities.PutWeeklyDatasActivity.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)
您正在检查以下变量 "totalOutMekanik" 是否为空。试试下面的代码。
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 {
}
}
请进行以下更改,即修剪 space 的字符串。
String totalOutMekanik = edTotalOutMekanik.getText().toString().trim();
String totalInMekanik = edTotalInMekanik.getText().toString().trim();
如果您查看 {string}.isEmpty()
的 official document,您会发现仅查看字符串的长度并判断它是否有价值。它不考虑 spaces。在你的情况下,我猜 space 导致了问题。
你检查空的方式是错误的。这是 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;
}
它不是检查空值。通过创建一个检查方法修复它:
public static boolean isBlank(String myString) {
if (myString == null) return false;
return myString.trim().length() != 0;
}
我确定它有效。
我必须编辑文本字段和文本视图,我必须在其中进行计算,并使用 Text Watcher 自动将其显示在文本视图中。但是我在编辑文本时遇到空字符串问题,当我在编辑文本模拟器中输入数字时崩溃并且错误是:
java.lang.NumberFormatException: empty String
我将字符串转换为 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 {
}
}
并且我添加了一个 if 条件来检查字符串是否为空,以及我的 Text Watcher
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);
编辑: 我的完整 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[=15=]0(PutWeeklyDatasActivity.java:36)
at al.sqmo.Activities.PutWeeklyDatasActivity.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)
您正在检查以下变量 "totalOutMekanik" 是否为空。试试下面的代码。
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 {
}
}
请进行以下更改,即修剪 space 的字符串。
String totalOutMekanik = edTotalOutMekanik.getText().toString().trim();
String totalInMekanik = edTotalInMekanik.getText().toString().trim();
如果您查看 {string}.isEmpty()
的 official document,您会发现仅查看字符串的长度并判断它是否有价值。它不考虑 spaces。在你的情况下,我猜 space 导致了问题。
你检查空的方式是错误的。这是 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;
}
它不是检查空值。通过创建一个检查方法修复它:
public static boolean isBlank(String myString) {
if (myString == null) return false;
return myString.trim().length() != 0;
}
我确定它有效。