java - 尽管我已经提到了它的代码,但当我没有提供任何输入时,我的应用程序就会关闭
问题描述
创建的应用程序会查找数字是否为三角形。有关更多详细信息,请参阅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”。谁能解释它是什么?
这是应用程序的外观 **
- 应用关闭时的 Logcat 详细信息
**
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 帧!应用程序可能在其主线程上做了太多工作。
解决方案
当我运行它时,它会引发异常。您的行号可能不同,但原因相同:
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();
}
推荐阅读
- python - pandas 将集合的 DataFrame 转换为字典的 DataFrame 的方法,其中值在其他 DataFrame 的相应单元格中
- rust - 如何在 Rust 中实现运行时选择的策略?
- python - Python重复命名
- python - python BeautifulSoup 和 Requests 的问题
- python - 在 Python 中过滤 JSON 元素不起作用
- node.js - 通过 chrome 终端将 Access-Control-Allow-Origin 添加到 fetch 方法的标题中
- c# - 从另一台 PC 访问 C# SQL 数据库
- mysql - 在 sequelize bulkCreate 时间戳不更新
- php - 使用 Nginx 托管超过 1 个简单的 wordpress 站点时出现重复的上游错误
- reactjs - 带有firebase auth的Django Rest框架权限