繁体   English   中英

java.lang.NumberFormatException:Android 中的空字符串

[英]java.lang.NumberFormatException: empty String in Android

我必须编辑文本字段和文本视图,我必须在其中进行计算,并使用文本观察器自动将其显示在文本视图中。 但是我在编辑文本上遇到了空字符串的问题,当我在编辑文本模拟器中输入一个数字时崩溃并且错误是:

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 条件来检查字符串是否为空,以及我的文本观察器

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

编辑:我的完整堆栈:

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)

请进行以下更改,即为空间修剪字符串。

String totalOutMekanik = edTotalOutMekanik.getText().toString().trim();
String totalInMekanik = edTotalInMekanik.getText().toString().trim();

如果您查看{string}.isEmpty() 官方文档,那么您会发现它只是字符串的长度并告诉它是否有价值。 它不考虑空格。 在你的情况下,我猜空间造成了问题。

您正在检查以下变量“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 {

    }

 }

你检查空的方式是错误的。 这是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;
    }

我确定这是工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM