如何捕获 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;
语句之前。
我正在尝试完成一个项目,我必须在我的程序中捕获 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;
语句之前。