我正在创建一个Tip计算器app..where我接受来自用户的总金额输入。我想在代码中添加一个例外,如果用户没有输入有效的数字,它会给消息Toast。我有三个按钮,为每个按钮创建了不同的方法。我将下面的代码粘贴到其中一个按钮,即10%提示
private void CalculateTipListener(){
BtnTip10.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
double amount = Double.parseDouble(etTotalAmount.getText().toString());
double TipAmount=amount/10;
tvTipAmount.setText("Tip: $"+TipAmount);
} catch(IOException e){
e.printStackTrace();
}
}
});
错误日志给我一个NumberFormatException错误。
01-12 20:10:39.872: E/AndroidRuntime(3299): java.lang.NumberFormatException: Invalid double: "gagajgalk"
01-12 20:10:39.872: E/AndroidRuntime(3299): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
01-12 20:10:39.872: E/AndroidRuntime(3299): at java.lang.StringToReal.parseDouble(StringToReal.java:269)
01-12 20:10:39.872: E/AndroidRuntime(3299): at java.lang.Double.parseDouble(Double.java:295)
01-12 20:10:39.872: E/AndroidRuntime(3299): at com.example.tipcalculator.TipCalculatorActivity$2.onClick(TipCalculatorActivity.java:47)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.view.View.performClick(View.java:4424)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.view.View$PerformClick.run(View.java:18383)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.os.Handler.handleCallback(Handler.java:733)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.os.Handler.dispatchMessage(Handler.java:95)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.os.Looper.loop(Looper.java:137)
01-12 20:10:39.872: E/AndroidRuntime(3299): at android.app.ActivityThread.main(ActivityThread.java:4998)
01-12 20:10:39.872: E/AndroidRuntime(3299): at java.lang.reflect.Method.invokeNative(Native Method)
01-12 20:10:39.872: E/AndroidRuntime(3299): at java.lang.reflect.Method.invoke(Method.java:515)
01-12 20:10:39.872: E/AndroidRuntime(3299): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-12 20:10:39.872: E/AndroidRuntime(3299): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-12 20:10:39.872: E/AndroidRuntime(3299): at dalvik.system.NativeStart.main(Native Method)
有人可以告诉我如何在这种情况下处理异常吗?我正在尝试Toast方法,但由于我在每个方法/监听器中使用了匿名类,所以它似乎不起作用。
感谢。
/ RD
答案 0 :(得分:1)
Catch NumberFormatException
而不是IOException
(请参阅堆栈跟踪)。
private void CalculateTipListener(){
BtnTip10.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
double amount = Double.parseDouble(etTotalAmount.getText().toString());
double TipAmount=amount/10;
tvTipAmount.setText("Tip: $"+TipAmount);
} catch(NumberFormatException e){
Toast.makeText (v.getContext(), "Invalid input!", Toast.LENGTH_SHORT).show();
//e.printStackTrace();
}
}
});
另外(因为问题更多的是关于制作Toast
而不是异常)
一旦你在匿名内部类中工作(如OnClickListener
,this
将引用该类。如果你想访问外部活动实例将其传递给Toast,你可以显式调用它使用ActivityName.this
。
您也可以使用View#getContext()
,因为您已经将View对象传递给方法。
答案 1 :(得分:0)
对我来说,你还需要显式捕获NumberFormatException,即:
try {
...
} catch (IOException e) {
...
} catch (NumberFormatException e) {
...
}
此外,您应该考虑在输入字符串中添加一些规则,例如trim(),并验证输入字符串是否为空/空。
答案 2 :(得分:0)
您可以将IOException更改为NumberFormatException,以解决您的问题。
答案 3 :(得分:0)
您正在捕捉IOException,但您需要捕获NumberFormatException,这在您的堆栈跟踪中甚至是状态(请阅读它)。
所以你可以改变这个:
catch(IOException e)
到这个
catch(NumberFormatException e)
额外说明:
要捕获任何错误,请使用Exception:
catch (Exception e) {
System.out.println("Error.");
}
您可以将这些组合起来以捕获不同的错误,以便您可以单独处理它们。例如:
try
{
double amount = Double.parseDouble(etTotalAmount.getText().toString());
double TipAmount=amount/10;
tvTipAmount.setText("Tip: $"+TipAmount);
}
catch (NumberFormatException n) {
// they didn't enter a number
Toast.makeText(getApplicationContext(), "Please enter a number.", 0).show();
}
catch (Exception e) {
// there is another, unspecified, exception
Toast.makeText(getApplicationContext(), "Unspecified exception.", 0).show();
}