【问题标题】:How to catch an IllegalArgumentException instead of terminating?如何捕获 IllegalArgumentException 而不是终止?
【发布时间】:2020-12-06 19:55:58
【问题描述】:

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

这是我的主要内容:

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 课程的相关部分:

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\9.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\jolen\AppData\Local\NetBeans\Cache\9.0\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 3 seconds)

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

【问题讨论】:

    标签: java exception try-catch illegalargumentexception


    【解决方案1】:

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

      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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        相关资源
        最近更新 更多