java - 如何显示自定义的 throw 语句

标签 java

所以我有一种方法,可以将键盘上的用户输入插入计算器。显然,我不能将字符串或负数放入输入字段中,因此我将所有三个输入都包含在 try block 中以捕获任何异常。问题是,当 try block 内的输入错误时,我试图抛出异常,但是当捕获异常时,它会显示 try-catch block 的消息。这是代码:

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 block 中显示这些自定义消息。如果有人能提供帮助那就太好了。

最佳答案

问题是你捕获了Exception,这意味着任何异常(以及excption的子类)都将在同一个 block 中捕获,解决方案是创建一个自定义异常并早于异常捕获它将其他异常(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,并针对特定错误使用第三个异常(在这两种情况下仍然建议扩展一个)

关于java - 如何显示自定义的 throw 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56838870/

相关文章:

java - 在广播的intent.putExtra中传递arraylist在getBundleExtra中给出null

Java 泛型,需要解释

java - 使用类元数据序列化 JSON

java - Java 中的递归类加载器

java - 防止 Controller 响应

java - 保护私有(private)内部 Web API 免受公共(public)访问的机制

java - 读取十进制数时发生 InputMismatchException

java - java中的Selenium无法识别类名

java - 动态设置ImageView.setImageUri不显示图像

java - 为什么 HttpUrlConnection 需要 getInputStream 来发送请求?