如何捕获 IllegalArgumentException 而不是终止?

How to catch an IllegalArgumentException instead of terminating?

我正在尝试完成一个项目,我必须在我的程序中捕获 IllegalArgumentException。它正确地抛出异常,但是当它抛出时,程序终止而不是 运行ning 我的捕获并继续。不确定出了什么问题,我尝试了一些不同的方法。

这是我的主要内容:

import java.util.Scanner;

public class MonthDaysTest 
{
  public static void main(String[] args) 
  {
    int month = 1, year = 2020;
    boolean tryAgain = true; //exception thrown test variable
    Scanner input = new Scanner(System.in);

    //repeats attempt for input until an exception is not thrown
    do
    {
        try
        {
            //prompts for int representing the month
            System.out.print ("Enter the month (1=January, 2=February, ..., 12=December): ");
            month = input.nextInt();

            //prompts for int representing the year
            System.out.print ("Enter the year: ");
            year = input.nextInt();
        
            //sets the test variable to false if an exception is not thrown
            tryAgain = false;
        }
        catch (IllegalArgumentException illegal)
        {                              
            input.nextLine(); //discards input so user can try again
            System.out.printf("Exception: %s%n%n", illegal.getMessage());
        }
    }
    while (tryAgain);

    MonthDays monthDay = new MonthDays(month, year);

    //prints out message with number of days in requested month
    System.out.printf ("%d%s%d%s%d%s", monthDay.getMonth(), "/", monthDay.getYear(), " has ", monthDay.getNumberOfDays(), " days.");
  }
}

以及我 MonthDays 的相关部分 class:

public class MonthDays
{
  private int month, year;

  //constructor for class
  public MonthDays(int month, int year)
  {
    setMonth(month);
    setYear(year);
  }                                  

  //sets the month while making sure it is valid
  public void setMonth(int month)
  {
    if (month < 1 || month > 12)
    {
      throw new IllegalArgumentException("Month must be between 1 and 12.");
    }
    this.month = month;
  }

  //sets the year while making sure it is valid in that it is after the implementation of the Gregorian calendar
  public void setYear(int year)
  {
    if (year < 1583)
    {
      throw new IllegalArgumentException("Year must be 1583 or later.");
    }
    this.year = year;
  }
}

当我运行程序输入非法月份时,我得到这个:

Exception in thread "main" java.lang.IllegalArgumentException: Month must be between 1 and 12.
    at monthDaysTest.MonthDays.setMonth(MonthDays.java:24)
    at monthDaysTest.MonthDays.<init>(MonthDays.java:15)
    at monthDaysTest.MonthDaysTest.main(MonthDaysTest.java:73)
C:\Users\jolen\AppData\Local\NetBeans\Cache.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\jolen\AppData\Local\NetBeans\Cache.0\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 3 seconds)

我发现了另一个问类似问题的问题,但我没有看到我所做的与那个问题的答案有什么不同。那是在这里:Catching IllegalArgumentException?

在构造函数中你调用的方法可以通过异常:

  public MonthDays(int month, int year)
  {
    setMonth(month);
    setYear(year);
  }      

您还需要将构造函数调用也放在 try catch 块中:

MonthDays monthDay = new MonthDays(month, year);

喜欢:

 MonthDays monthDay;
do
{
    try
    {
        //prompts for int representing the month
        System.out.print ("Enter the month (1=January, 2=February, ..., 12=December): ");
        month = input.nextInt();

        //prompts for int representing the year
        System.out.print ("Enter the year: ");
        year = input.nextInt();
        monthDay  = new MonthDays(month, year)
    
        //sets the test variable to false if an exception is not thrown
        tryAgain = false;
    }
    catch (IllegalArgumentException illegal)
    {                              
        input.nextLine(); //discards input so user can try again
        System.out.printf("Exception: %s%n%n", illegal.getMessage());
    }
}
while (tryAgain);

抛出异常的代码需要在try-catch块中才能被捕获。在您的情况下 new MonthDays(month, year); 抛出 IlligalArgumantException。您应该将 MonthDays monthDay = new MonthDays(month, year); 行放在 tryAgain = false; 语句之前。