捕获无效输入的IOException

时间:2014-01-13 01:56:57

标签: java android

我正在创建一个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

4 个答案:

答案 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而不是异常) 一旦你在匿名内部类中工作(如OnClickListenerthis将引用该类。如果你想访问外部活动实例将其传递给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();
}
相关问题