Java 没有输入后,仿真器会发出响声
我对Java和Android应用程序非常陌生,我正在创建一个简单的计算器,一切都进行得很顺利,但我发现了一个问题,那就是当我只需按例如乘法,没有数字时,我的模拟器就会崩溃,我的监听器中缺少某种cod,但无法找到它的内容和去向。这是我的主要活动,Java:Java 没有输入后,仿真器会发出响声,java,android,android-emulator,Java,Android,Android Emulator,我对Java和Android应用程序非常陌生,我正在创建一个简单的计算器,一切都进行得很顺利,但我发现了一个问题,那就是当我只需按例如乘法,没有数字时,我的模拟器就会崩溃,我的监听器中缺少某种cod,但无法找到它的内容和去向。这是我的主要活动,Java: package com.firstprogram; import android.os.Bundle; import android.app.Activity; import android.text.Inpu
package com.firstprogram;
import android.os.Bundle;
import android.app.Activity;
import android.text.InputType;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
LinearLayout layout1;
LinearLayout buttonLayout;
EditText number1text;
EditText number2text;
Button multiplyButton;
Button divideButton;
Button addButton;
Button subButton;
TextView answerText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
layout1 = new LinearLayout (this);
buttonLayout = new LinearLayout (this);
number1text = new EditText (this);
number2text = new EditText (this);
multiplyButton = new Button (this);
divideButton = new Button (this);
addButton = new Button (this);
subButton = new Button (this);
answerText = new TextView (this);
answerText.setTextSize(TypedValue.COMPLEX_UNIT_SP,28);
layout1.setOrientation(LinearLayout.VERTICAL);
layout1.setGravity(Gravity.CENTER_HORIZONTAL);
buttonLayout.setOrientation(LinearLayout.HORIZONTAL);
buttonLayout.setGravity(Gravity.CENTER_HORIZONTAL);
number1text.setInputType(InputType.TYPE_CLASS_NUMBER);
number2text.setInputType(InputType.TYPE_CLASS_NUMBER);
answerText.setGravity(Gravity.CENTER_HORIZONTAL);
answerText.setText("0");
multiplyButton.setText("X");
divideButton.setText("/");
addButton.setText("+");
subButton.setText("-");
multiplyButton.setOnClickListener((android.view.View.OnClickListener) multiplyClicked);
divideButton.setOnClickListener((android.view.View.OnClickListener) divideClicked);
addButton.setOnClickListener((android.view.View.OnClickListener) addClicked);
subButton.setOnClickListener((android.view.View.OnClickListener) subClicked);
buttonLayout.addView(multiplyButton);
buttonLayout.addView(divideButton);
buttonLayout.addView(addButton);
buttonLayout.addView(subButton);
layout1.addView(number1text);
layout1.addView(number2text);
layout1.addView(buttonLayout);
layout1.addView(answerText);
setContentView(layout1);
number1text.setLayoutParams(new LinearLayout.LayoutParams(500,50));
number2text.setLayoutParams(new LinearLayout.LayoutParams(500,50));
multiplyButton.setLayoutParams(new LinearLayout.LayoutParams(50,50));
divideButton.setLayoutParams(new LinearLayout.LayoutParams(50,50));
addButton.setLayoutParams(new LinearLayout.LayoutParams(50,50));
subButton.setLayoutParams(new LinearLayout.LayoutParams(50,50));
}
private View.OnClickListener multiplyClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
double result = firstNumber * secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
}
};
private View.OnClickListener divideClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
if(secondNumber!=0) {
double result = firstNumber / secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
}
}
};
private View.OnClickListener addClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
double result = firstNumber + secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
}
};
private View.OnClickListener subClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
double result = firstNumber - secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
}
};
}
以下是日志:
08-23 07:15:06.241: D/gralloc_goldfish(792): Emulator without GPU emulation detected.
08-23 07:15:15.631: D/dalvikvm(792): GC_FOR_ALLOC freed 257K, 14% free 2762K/3176K, paused 50ms, total 63ms
08-23 07:20:06.893: D/gralloc_goldfish(850): Emulator without GPU emulation detected.
08-23 07:21:21.171: I/Choreographer(850): Skipped 33 frames! The application may be doing too much work on its main thread.
08-23 07:21:30.881: I/Choreographer(850): Skipped 31 frames! The application may be doing too much work on its main thread.
08-23 07:23:39.641: D/gralloc_goldfish(893): Emulator without GPU emulation detected.
08-23 07:29:47.051: I/Choreographer(893): Skipped 42 frames! The application may be doing too much work on its main thread.
08-23 07:37:02.152: I/Choreographer(893): Skipped 35 frames! The application may be doing too much work on its main thread.
08-23 07:38:16.154: D/gralloc_goldfish(936): Emulator without GPU emulation detected.
08-23 07:51:40.516: I/Choreographer(936): Skipped 72 frames! The application may be doing too much work on its main thread.
08-23 07:53:47.001: I/Choreographer(936): Skipped 58 frames! The application may be doing too much work on its main thread.
08-23 08:22:32.431: I/Choreographer(936): Skipped 32 frames! The application may be doing too much work on its main thread.
08-23 08:36:53.827: I/Choreographer(936): Skipped 54 frames! The application may be doing too much work on its main thread.
08-23 08:51:51.864: I/Choreographer(936): Skipped 54 frames! The application may be doing too much work on its main thread.
08-23 08:56:47.101: I/Choreographer(936): Skipped 34 frames! The application may be doing too much work on its main thread.
08-23 08:57:40.044: I/Choreographer(936): Skipped 42 frames! The application may be doing too much work on its main thread.
08-23 09:07:14.461: I/Choreographer(936): Skipped 48 frames! The application may be doing too much work on its main thread.
08-23 09:08:47.069: I/Choreographer(936): Skipped 32 frames! The application may be doing too much work on its main thread.
08-23 09:14:26.301: D/gralloc_goldfish(1109): Emulator without GPU emulation detected.
08-23 09:14:31.151: D/AndroidRuntime(1109): Shutting down VM
08-23 09:14:31.151: W/dalvikvm(1109): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
08-23 09:14:31.231: E/AndroidRuntime(1109): FATAL EXCEPTION: main
08-23 09:14:31.231: E/AndroidRuntime(1109): java.lang.NumberFormatException: Invalid double: ""
08-23 09:14:31.231: E/AndroidRuntime(1109): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
08-23 09:14:31.231: E/AndroidRuntime(1109): at java.lang.StringToReal.parseDouble(StringToReal.java:248)
08-23 09:14:31.231: E/AndroidRuntime(1109): at java.lang.Double.parseDouble(Double.java:295)
08-23 09:14:31.231: E/AndroidRuntime(1109): at com.firstprogram.MainActivity$2.onClick(MainActivity.java:93)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.view.View.performClick(View.java:4240)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.view.View$PerformClick.run(View.java:17721)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.os.Handler.handleCallback(Handler.java:730)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.os.Looper.loop(Looper.java:137)
08-23 09:14:31.231: E/AndroidRuntime(1109): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-23 09:14:31.231: E/AndroidRuntime(1109): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 09:14:31.231: E/AndroidRuntime(1109): at java.lang.reflect.Method.invoke(Method.java:525)
08-23 09:14:31.231: E/AndroidRuntime(1109): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-23 09:14:31.231: E/AndroidRuntime(1109): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 09:14:31.231: E/AndroidRuntime(1109): at dalvik.system.NativeStart.main(Native Method)
08-23 09:14:31.321: D/dalvikvm(1109): GC_FOR_ALLOC freed 243K, 13% free 2776K/3176K, paused 57ms, total 73ms
08-23 09:14:51.461: D/gralloc_goldfish(1152): Emulator without GPU emulation detected.
08-23 09:21:59.242: I/Choreographer(1152): Skipped 39 frames! The application may be doing too much work on its main thread.
08-23 09:27:10.061: I/Choreographer(1152): Skipped 69 frames! The application may be doing too much work on its main thread.
08-23 09:42:37.441: D/gralloc_goldfish(1211): Emulator without GPU emulation detected.
08-23 09:48:27.291: D/gralloc_goldfish(1258): Emulator without GPU emulation detected.
08-23 09:48:34.741: D/dalvikvm(1258): GC_FOR_ALLOC freed 240K, 13% free 2779K/3176K, paused 68ms, total 76ms
08-23 09:51:57.135: I/Choreographer(1258): Skipped 97 frames! The application may be doing too much work on its main thread.
08-23 09:59:16.411: I/Choreographer(1258): Skipped 38 frames! The application may be doing too much work on its main thread.
08-23 09:59:21.872: D/AndroidRuntime(1258): Shutting down VM
08-23 09:59:21.872: W/dalvikvm(1258): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
08-23 09:59:21.991: E/AndroidRuntime(1258): FATAL EXCEPTION: main
08-23 09:59:21.991: E/AndroidRuntime(1258): java.lang.NumberFormatException: Invalid double: ""
08-23 09:59:21.991: E/AndroidRuntime(1258): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
08-23 09:59:21.991: E/AndroidRuntime(1258): at java.lang.StringToReal.parseDouble(StringToReal.java:248)
08-23 09:59:21.991: E/AndroidRuntime(1258): at java.lang.Double.parseDouble(Double.java:295)
08-23 09:59:21.991: E/AndroidRuntime(1258): at com.firstprogram.MainActivity$1.onClick(MainActivity.java:91)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.view.View.performClick(View.java:4240)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.view.View$PerformClick.run(View.java:17721)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.os.Handler.handleCallback(Handler.java:730)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.os.Looper.loop(Looper.java:137)
08-23 09:59:21.991: E/AndroidRuntime(1258): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-23 09:59:21.991: E/AndroidRuntime(1258): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 09:59:21.991: E/AndroidRuntime(1258): at java.lang.reflect.Method.invoke(Method.java:525)
08-23 09:59:21.991: E/AndroidRuntime(1258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-23 09:59:21.991: E/AndroidRuntime(1258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 09:59:21.991: E/AndroidRuntime(1258): at dalvik.system.NativeStart.main(Native Method)
08-23 09:59:25.653: I/Process(1258): Sending signal. PID: 1258 SIG: 9
08-23 09:59:51.091: D/gralloc_goldfish(1314): Emulator without GPU emulation detected.
08-23 09:59:57.921: D/AndroidRuntime(1314): Shutting down VM
08-23 09:59:57.921: W/dalvikvm(1314): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
08-23 09:59:58.061: D/dalvikvm(1314): GC_FOR_ALLOC freed 241K, 13% free 2778K/3176K, paused 62ms, total 70ms
08-23 09:59:58.072: E/AndroidRuntime(1314): FATAL EXCEPTION: main
08-23 09:59:58.072: E/AndroidRuntime(1314): java.lang.NumberFormatException: Invalid double: ""
08-23 09:59:58.072: E/AndroidRuntime(1314): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
08-23 09:59:58.072: E/AndroidRuntime(1314): at java.lang.StringToReal.parseDouble(StringToReal.java:248)
08-23 09:59:58.072: E/AndroidRuntime(1314): at java.lang.Double.parseDouble(Double.java:295)
08-23 09:59:58.072: E/AndroidRuntime(1314): at com.firstprogram.MainActivity$1.onClick(MainActivity.java:92)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.view.View.performClick(View.java:4240)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.view.View$PerformClick.run(View.java:17721)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.os.Handler.handleCallback(Handler.java:730)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.os.Looper.loop(Looper.java:137)
08-23 09:59:58.072: E/AndroidRuntime(1314): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-23 09:59:58.072: E/AndroidRuntime(1314): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 09:59:58.072: E/AndroidRuntime(1314): at java.lang.reflect.Method.invoke(Method.java:525)
08-23 09:59:58.072: E/AndroidRuntime(1314): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-23 09:59:58.072: E/AndroidRuntime(1314): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 09:59:58.072: E/AndroidRuntime(1314): at dalvik.system.NativeStart.main(Native Method)
08-23 10:00:00.761: I/Process(1314): Sending signal. PID: 1314 SIG: 9
08-23 10:01:31.132: D/gralloc_goldfish(1365): Emulator without GPU emulation detected.
08-23 10:01:47.221: D/dalvikvm(1365): GC_FOR_ALLOC freed 242K, 13% free 2777K/3176K, paused 77ms, total 85ms
08-23 10:01:47.221: D/AndroidRuntime(1365): Shutting down VM
08-23 10:01:47.232: W/dalvikvm(1365): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
08-23 10:01:47.281: E/AndroidRuntime(1365): FATAL EXCEPTION: main
08-23 10:01:47.281: E/AndroidRuntime(1365): java.lang.NumberFormatException: Invalid double: ""
08-23 10:01:47.281: E/AndroidRuntime(1365): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
08-23 10:01:47.281: E/AndroidRuntime(1365): at java.lang.StringToReal.parseDouble(StringToReal.java:248)
08-23 10:01:47.281: E/AndroidRuntime(1365): at java.lang.Double.parseDouble(Double.java:295)
08-23 10:01:47.281: E/AndroidRuntime(1365): at com.firstprogram.MainActivity$1.onClick(MainActivity.java:92)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.view.View.performClick(View.java:4240)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.view.View$PerformClick.run(View.java:17721)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.os.Handler.handleCallback(Handler.java:730)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.os.Looper.loop(Looper.java:137)
08-23 10:01:47.281: E/AndroidRuntime(1365): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-23 10:01:47.281: E/AndroidRuntime(1365): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 10:01:47.281: E/AndroidRuntime(1365): at java.lang.reflect.Method.invoke(Method.java:525)
08-23 10:01:47.281: E/AndroidRuntime(1365): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-23 10:01:47.281: E/AndroidRuntime(1365): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 10:01:47.281: E/AndroidRuntime(1365): at dalvik.system.NativeStart.main(Native Method)
08-23 10:01:49.873: I/Process(1365): Sending signal. PID: 1365 SIG: 9
在你的监听器
onClick
中,你正在抓取number1text
和number2text
中的文本,并试图将它们转换为Double
s。如果这些字符串为空(或者用户键入了类似“hello,there!”的内容),系统将无法将字符串转换为数字,您将得到一个NumberFormatException
。这几乎肯定就是这里发生的事情,尽管LogCat的输出应该指定
您需要将所有的
parseDouble
调用打包到try…捕获块并采取适当的措施(比如弹出一个祝酒词说“我不能那样做,戴夫。”然后不继续进行)。在您的侦听器中单击一次
,您正在抓取number1text
和number2text
中的文本,并尝试将它们转换为Double
s。如果这些字符串为空(或者用户键入了类似“hello,there!”的内容),系统将无法将字符串转换为数字,您将得到一个NumberFormatException
。这几乎肯定就是这里发生的事情,尽管LogCat的输出应该指定
您需要将所有的parseDouble
调用打包到try…捕获块并采取适当的措施(比如弹出祝酒词说“我不能那样做,戴夫。”然后不继续执行)。您只需在每个按钮侦听器中放入if
语句,即可检查是否给出了数字。如果字符串为“”,则parseDouble将失败,这就是出现错误的原因
例如:
private View.OnClickListener multiplyClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
if (firstString != NULL && secondString != NULL) { // Checks strings aren't null
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
double result = firstNumber * secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
} else {
// Do something eg. print "Can't do that!"
}
}
};
您可以简单地在每个按钮侦听器中放入if
语句,检查是否给出了数字。如果字符串为“”,则parseDouble将失败,这就是出现错误的原因
例如:
private View.OnClickListener multiplyClicked = new View.OnClickListener() {
@Override
public void onClick (View v){
String firstString = number1text.getText().toString();
String secondString = number2text.getText().toString();
if (firstString != NULL && secondString != NULL) { // Checks strings aren't null
double firstNumber = Double.parseDouble(firstString);
double secondNumber = Double.parseDouble(secondString);
double result = firstNumber * secondNumber;
String resultString = String.valueOf(result);
answerText.setText(resultString);
} else {
// Do something eg. print "Can't do that!"
}
}
};
这就是问题所在
在乘法或执行任何操作之前,您需要检查输入是否为null或空,还可以检查输入是否为数字(即使用户只能输入数字)
这就是问题所在
在乘法或执行任何操作之前,您需要检查输入是否为null或空,还可能需要检查输入是否为数字(即使用户只能输入数字)您需要在此处发布LogCat的输出。您的应用程序崩溃或整个模拟器(窗口消失)?我添加了LogCat和应用程序崩溃您需要在此处发布LogCat的输出。您的应用程序崩溃或整个模拟器(窗口消失)?我添加了LogCat和应用程序崩溃,这将解决眼前的问题,但如果有人输入了仍然不是有效数字的非空字符串,则不会(即使只有数字键盘也可以使用类似1.1.1.1
的功能)。捕获NumberFormatException
更可靠。是的,你是对的,我没有想到这种情况。Try/catch更好,正如你的回答所表明的那样,它可以解决眼前的问题,但如果有人输入一个仍然不是有效数字的非空字符串,则不能(像1.1.1.1
这样的东西,即使只有数字键盘也是可能的)。捕捉NumberFormatException
更可靠。是的,你是对的,我没有想到那种情况。正如你的回答所建议的,Try/catch更好