2014-01-13 2 views
0

Я создаю приложение калькулятора Tip, где я принимаю входные данные от пользователей в терминах общей суммы. Я хочу добавить исключение в код, в котором он будет Toast сообщение, если Пользователь не вводит действительный номер. У меня есть три кнопки и для каждой кнопки созданы разные методы. Я вставить код ниже для одной из кнопок, т.е. 10% журналов наконечникCatch 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(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, но он не работает, поскольку я использовал анонимные классы в каждом методе/слушателе.

Спасибо.

+0

Почему метод Тоста не работает? – panini

+0

'Метод makeText (Context, CharSequence, int) в типе Toast не применим для аргументов (new View.OnClickListener() {}, String, int)' Это ошибка, которую я получаю, когда я использую Toast. – rond

+0

Почему вы ловите 'IOException'? Исключением является 'NumberFormatException' –

ответ

1

Поймайте 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 будет относиться к этому классу. Если вы хотите получить доступ экземпляр внешней активности, чтобы передать его на тост, вы можете явно вызвать его с помощью ActivityName.this.

вы также можете использовать View#getContext(), поскольку у вас уже есть Посмотреть объект, переданный методу.

+1

Хорошо, это похоже на работу Toast.makeText (getBaseContext(), «Пожалуйста, введите допустимое число», Toast.LENGTH_SHORT) .show(); '. Я использовал «это», и я думаю, что это тоже сработало. Я раньше не встречал 'v.getContext()'. – rond

0

Мне кажется, вам также нужно явно поймать NumberFormatException, то есть:

try { 
    ... 
} catch (IOException e) { 
    ... 
} catch (NumberFormatException e) { 
    ... 
} 

Также следует рассмотреть вопрос о добавлении некоторых правил, как обшивка() 'ИНГ строки ввода и проверках входной строки не является нулем/пустым.

0

Вы можете изменить исключение IOException на NumberFormatException, чтобы решить эту проблему.

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(); 
} 
Смежные вопросы