Как отобразить пользовательский оператор броска - PullRequest
1 голос
/ 01 июля 2019

Итак, у меня есть метод, который использует userInput на клавиатуре для подключения к калькулятору.Очевидно, что в поле ввода не может быть строк или отрицательных чисел, поэтому все три входа заключены в блок try, чтобы перехватить любое исключение.Проблема в том, что я пытаюсь выдать исключение, когда ввод неправильный ВНУТРИ блока try, но когда исключение перехвачено, отображается сообщение блока try-catch.Вот код:

public static void calculateTips()
{
//Varibles
int tipPercentage = 0;
int partySize = 0;
double billAmount = 0.0;
//Variable to loop through try catch blocks 
int x = 0;

String yesOrNo;

 boolean choice;
//Decimal Format 
DecimalFormat dollar = new DecimalFormat("$###,##0.00");

//Declare object
TipCalculator bill;

//Create Scanner object
Scanner userInput = new Scanner(System.in);

do
{
  //Fill values for tip calculator from user 
  System.out.println("Enter the bill amount: ");

  try
  {

     billAmount = userInput.nextDouble();

     if(billAmount < 0)

      throw new Exception("Bill amount can not be negative. Please try again."); 



     System.out.println("Enter your desired tip percentage (20 equals 20%): ");
     tipPercentage = userInput.nextInt();

     if(tipPercentage < 0)
       throw new Exception("Tip percentage can not be negative. Please try again."); 

     System.out.println("Enter the size of your party: ");
     partySize = userInput.nextInt();

      if(partySize < 0)
        throw new Exception("Party Size can not be negative. Please try again."); 


  }
  catch(Exception e)
  {
   System.out.println("Invalid Input. Please try again." + "\n");
   calculateTips();
  }

Я пытался использовать InputMismatchType как общее исключение, но мне не повезло, что это сработало.Как вы видите, я пытаюсь отобразить эти пользовательские сообщения в блоке try.Если кто-то может помочь, это было бы здорово.

1 Ответ

1 голос
/ 01 июля 2019

Проблема в том, что вы перехватываете Exception, это означает, что любое исключение (и подклассы исключения) будет перехвачено в одном и том же блоке, решение состоит в том, чтобы создать собственное исключение и перехватить его раньше, чем исключение, оставив другие исключения для по умолчанию у вас есть такие:

try  {
  billAmount = userInput.nextDouble();
   if(billAmount < 0)
      throw new MyException("Bill amount can not be negative. Please try again."); 
} catch(MyException e) { // catch a specific exception first
 System.out.println("Exception" + e.getLocalizedMessage());
} catch(Throwable e) { // get all others to fall here, also using Throwable here cause it is also super for Exception and RuntimeException
 System.out.println("Invalid Input. Please try again." + "\n");
 calculateTips();
}
// and declare in the scope of class
class MyException extends Exception {
     MyException(String message) { super(message); }
}

Кроме того, еще одно решение - перехватить определенные ArithmeticExceptions и ParseExceptions в перехватах и ​​использовать третий для вашей конкретной ошибки (в обоих случаях все еще предлагается расширение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...