首页 > 解决方案 > 尽管我已经提到了它的代码,但当我没有提供任何输入时,我的应用程序就会关闭

问题描述

创建的应用程序会查找数字是否为三角形。有关更多详细信息,请参阅https://en.wikipedia.org/wiki/Triangular_number

现在,当我单击按钮而不在 TextView 中输入任何内容时,应用程序会突然关闭。不应该这样,因为我已经在代码中有一个空字符串的 if 语句。

    package com.example.numbershapes;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;

    class Number {
        int number;

        public boolean isTriangular() {
            int x = 1;
            int triangularNmbr = 1;
            while (triangularNmbr < number) {
                x++;
                triangularNmbr += x;
            }
            if(triangularNmbr == number) {
                return true;
            }
            else {
                return false;
            }
        }
    }
    public class MainActivity extends AppCompatActivity {
        public void testNumber(View view)
        {
            EditText usersNumber = 
            (EditText)findViewById(R.id.usersNumber);
            String message = "";
            if(usersNumber.getText().toString().isEmpty()){
                message = "Please enter a number";
            }
            Number myNumber = new Number();
            myNumber.number =
Integer.parseInt(usersNumber.getText().toString());


            //will display on logcat
            System.out.println(myNumber.isTriangular());

            if(myNumber.isTriangular()){
                message = myNumber.number + " is triangular" ;
            }
            else{
                message = myNumber.number + " is not triangular" ;
            }
            Toast.makeText(getApplicationContext(), message, 
            Toast.LENGTH_LONG).show();
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    }

另外,我在事件日志中收到错误。“无法为调试器绑定到本地 8600”。谁能解释它是什么?

这是应用程序的外观 **

**

2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6662) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1118) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2599) 2019-09-08 00:38:56.005 4718 -4718/? 我/艺术:在 void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2707) 2019-09-08 00:38: 56.005 4718-4718/? 我/艺术:在 void android.app.ActivityThread.-wrap12(android.app. ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1460) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.os.Looper.loop() (Looper.java:154) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6077) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2) 2019-09-08 00: 38:56.005 4718-4718/? 我/艺术:在 void com.android。internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:866) 2019-09-08 00:38:56.005 4718-4718/? 我/艺术:在 void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:756) 2019-09-08 00:38:56.142 1314-1322/? E/SurfaceFlinger: ro.sf.lcd_density 必须定义为构建属性 2019-09-08 00:38:56.190 4718-4734/com.example.numbershapes I/OpenGLRenderer: Initialized EGL, version 1.4 2019-09-08 00 :38:56.190 4718-4734/com.example.numbershapes D/OpenGLRenderer: 交换行为 1 2019-09-08 00:38:56.192 4718-4734/com.example.numbershapes W/OpenGLRenderer: 无法使用 EGL_SWAP_BEHAVIOR_PRESERVED 选择配置,重试没有... 2019-09-08 00:38:56.192 4718-4734/com.example.numbershapes D/OpenGLRenderer:交换行为 0 2019-09-08 00:38:56.320 4718-4734/com.example.numbershapes D/EGL_emulation: eglCreateContext: 0x8d11ba20: maj 2 min 0 rcv 2 2019-09-08 00:38:56.596 4718-4734/com.example.numbershapes D/EGL_emulation: eglMakeCurrent: 0x8d11ba20: ver 2 0 (tinfo 0x9b763770) 2019-09-08 003:8 :56.634 4718-4718/com.example.numbershapes W/art: 在 Android 4.1 之前,方法 int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) 会错误地覆盖 android.widget 中的包私有方法.ListView 2019-09-08 00:38:56.693 4718-4734/com.example.numbershapes D/EGL_emulation: eglMakeCurrent: 0x8d11ba20: ver 2 0 (tinfo 0x9b763770) 2019-09-08 00:38:56.996 1601-1621/ ? I/ActivityManager: 显示 com.example.numbershapes/.MainActivity: +1s767ms 2019-09-08 00:38:57.010 1671-1862/? D/EGL_emulation: eglMakeCurrent: 0xa8e855a0: ver 2 0 (tinfo 0xa8e83640) 2019-09-08 00:38:57.035 1601-1751/? 我/窗口管理器:com.android.server.wm.WindowStateAnimator.destroySurface:2016 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:882 调用的破坏表面 Surface(name=com.android.systemui/com.android.systemui.recents.RecentsActivity) com.android.server.wm.WindowState.destroyOrSaveSurface:2100 com.android.server.wm.WindowManagerService.tryStartExitingAnimation:3024 com.android.server.wm.WindowManagerService.relayoutWindow:2904 com.android.server.wm.Session.relayout :224 android.view.IWindowSession$Stub.onTransact:286 com.android.server.wm.Session.onTransact:145 2019-09-08 00:38:57.192 1601-1621/? I/WindowManager: com.android.server.wm.WindowStateAnimator.destroySurface:2016 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:882 com.android.server 调用的破坏表面 Surface(name=Starting com.example.numbershapes) .wm。WindowState.destroyOrSaveSurface:2100 com.android.server.wm.AppWindowToken.destroySurfaces:363 com.android.server.wm.WindowStateAnimator.finishExit:565 com.android.server.wm.WindowStateAnimator.stepAnimationLocked:491 com.android.server。 wm.WindowAnimator.updateWindowsLocked:303 com.android.server.wm.WindowAnimator.animateLocked:704 2019-09-08 00:38:58.432 1360-1394/? W/audio_hw_generic:没有向 HAL 提供足够的数据,预期位置 5063852,只写了 4803840 2019-09-08 00:39:00.016 1671-1862/?D/EGL_emulation: eglMakeCurrent: 0xa8e855a0: ver 2 0 (tinfo 0xa8e83640) 2019-09-08 00:39:00.232 4718-4718/com.example.numbershapes D/AndroidRuntime: 关闭 VM 2019-09-08 00:39: 00.241 4718-4718/com.example.numbershapes E/AndroidRuntime:致命异常:主进程:com.example.numbershapes,PID:4718 java.lang.IllegalStateException:java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 2019-09-08 00:39:00.241 1360-1393/? W/audio_hw_generic:没有向 HAL 提供足够的数据,预期位置 4803995,只写了 4803840 2019-09-08 00:39:00.244 1601-1612/?W/ActivityManager:强制完成活动 com.example.numbershapes/.MainActivity 2019-09-08 00:39:00.325 1601-4290/? I/OpenGLRenderer:初始化 EGL,版本 1.4 2019-09-08 00:39:00.325 1601-4290/?D/OpenGLRenderer:交换行为 1 2019-09-08 00:39:00.327 1601-4290/? W/OpenGLRenderer:无法选择带有 EGL_SWAP_BEHAVIOR_PRESERVED 的配置,重试没有... 2019-09-08 00:39:00.327 1601-4290/?D/OpenGLRenderer:交换行为 0 2019-09-08 00:39:00.347 1601-4290/? D/EGL_emulation: eglCreateContext: 0x8ec4d1c0: maj 2 min 0 rcv 2 2019-09-08 00:39:00.368 1601-4290/? D/EGL_仿真:eglMakeCurrent: 0x8ec4d1c0: ver 2 0 (tinfo 0x8e191ff0) 2019-09-08 00:39:00.405 1601-4290/? D/EGL_emulation: eglMakeCurrent: 0x8ec4d1c0: ver 2 0 (tinfo 0x8e191ff0) 2019-09-08 00:39:00.758 1601-1614/? W/ActivityManager:ActivityRecord{aa667d7 u0 com.example.numbershapes/.MainActivity t26 f} 2019-09-08 00:39:00.803 1314-1322/的活动暂停超时?D/gralloc_ranchu:gralloc_alloc:创建大小为 2691072 2019-09-08 00:39:00.842 1314-1314/? E/EGL_emulation: tid 1314: eglCreateSyncKHR(1901): error 0x3004 (EGL_BAD_ATTRIBUTE) 2019-09-08 00:39:01.450 2026-2273/? D/EGL_emulation: eglMakeCurrent: 0xa8e85420: ver 2 0 (tinfo 0xa8e838e0) 2019-09-08 00:39:01.938 2026-2273/? W / OpenGLRenderer:在视图上错误地调用buildLayer:ShortcutAndWidgetContainer,破坏层...... 2019-09-08 00:39:01.952 1601-1614 /?我/活动经理:杀死 3960:com.google.android.apps.photos/u0a63 (adj 906): empty for 3445s 2019-09-08 00:39:02.006 1601-1658/? D/ActivityManager: cleanUpApplicationRecord -- 3960 2019-09-08 00:39:03.453 1360-1394/? W/audio_hw_generic:没有向 HAL 提供足够的数据,预期位置 5110293,只写了 4957920 2019-09-08 00:39:14.093 1601-1614/?W/ActivityManager:ActivityRecord{aa667d7 u0 com.example.numbershapes/.MainActivity t26 f} 2019-09-08 00:39:14.098 1601-1614/?I/WindowManager: com.android.server.wm.WindowStateAnimator.destroySurface:2016 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked 调用的破坏表面 Surface(name=com.example.numbershapes/com.example.numbershapes.MainActivity) :882 com.android.server.wm.WindowState.removeLocked:1456 com.android.server.wm.WindowManagerService。removeWindowInnerLocked:2484 com.android.server.wm.WindowManagerService.removeWindowLocked:2442 com.android.server.wm.WindowManagerService.removeWindowLocked:2311 com.android.server.wm.AppWindowToken.removeAllWindows:530 com.android.server.wm。 AppWindowToken.removeAppFromTaskLocked:326 2019-09-08 00:39:16.767 1314-1326/? W/SurfaceFlinger:等待硬件 vsync 超时;伪造它 2019-09-08 00:39:17.955 1601-1621/?I/Choreographer:跳过了 37 帧!应用程序可能在其主线程上做了太多工作。等待硬件 vsync 超时;伪造它 2019-09-08 00:39:17.955 1601-1621/?I/Choreographer:跳过了 37 帧!应用程序可能在其主线程上做了太多工作。等待硬件 vsync 超时;伪造它 2019-09-08 00:39:17.955 1601-1621/?I/Choreographer:跳过了 37 帧!应用程序可能在其主线程上做了太多工作。

标签: javaandroid

解决方案


当我运行它时,它会引发异常。您的行号可能不同,但原因相同:

     Caused by: java.lang.NumberFormatException: For input string: ""
        at java.lang.Integer.parseInt(Integer.java:620)
        at java.lang.Integer.parseInt(Integer.java:643)
        at stackoverflow57836483.MainActivity.testNumber(MainActivity.java:39)

有问题的行是:

myNumber.number = Integer.parseInt(usersNumber.getText().toString());

但真正的原因发生得更早。
在这里,您已经知道输入无效,但您继续执行并将其解析为数字。

if(usersNumber.getText().toString().isEmpty()){
   message = "Please enter a number";
}

else { }除了显示 Toast 之外,你应该把后面的所有东西都放进去。正确的代码是:

        public void testNumber(View view)
        {
            EditText usersNumber = (EditText)findViewById(R.id.usersNumber);
            String message = "";
            if(usersNumber.getText().toString().isEmpty()){
                message = "Please enter a number";
            } else {                                // ELSE STARTS HERE...
                Number myNumber = new Number();
                myNumber.number = Integer.parseInt(usersNumber.getText().toString());

                //will display on logcat
                System.out.println(myNumber.isTriangular());

                if(myNumber.isTriangular()){
                    message = myNumber.number + " is triangular" ;
                }
                else{
                    message = myNumber.number + " is not triangular" ;
                }
            }                                       // AND ENDS HERE
            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
        }

推荐阅读