[英]Looping and exception handling in java main method
我正在研究一个相当基本的问题:我正在编写一个Java程序,该程序接受一天,月份和年份的字符串(以整数形式,例如24/9/2015),然后将其转换为日期的基于单词的版本(例如2015年9月24日)。
我还需要能够通过创建我自己的异常类来处理用户从上面键入“无效”值的问题。
当引发异常时(例如,用户输入“无效”月份),程序应提示用户仅重新输入错误的值(因此,在这种情况下,它将提示用户仅重新输入月份)。
这是我到目前为止编写的代码(您可以假设异常类已经正确定义并且可以正常工作):
import java.util.Scanner;
public class ParseDate {
public static void main(String args[]){
String month, day, year;
Scanner input = new Scanner(System.in);
System.out.println("Enter the day: ");
day = input.nextLine();
System.out.println("Enter the month: ");
month = input.nextLine();
System.out.println("Enter the year: ");
year = input.nextLine();
try{
formatDate(month, day, year);
}
catch(MonthException m){
//?
}
catch(DayException d){
//??
}
catch(YearException y){
//???
}
}
public static String formatDate(String month, String day, String year)
throws MonthException, DayException, YearException{
String output;
if (Integer.parseInt(month) < 1 || Integer.parseInt(month) > 12){
throw new MonthException("Invalid month. reenter.");
}
if (Integer.parseInt(year) < 1000 || Integer.parseInt(year) > 3000){
throw new MonthException("Invalid year. reenter.");
}
if (Integer.parseInt(day) < 1){
throw new MonthException("Invalid day. reenter.");
//extra code to handle the cases where the day is
//too large for the particular month and year entered
}
//other code here for converting date
return output;
}
}
正如您可能从我的代码中看到的那样,我在确定应该在哪里以及如何使程序分别循环遍历异常时遇到麻烦。 我本来想使用switch
但不太确定该在哪里放置switch
。
我怎样才能做到这一点?
因此,基本上,您需要某种方式来维护循环之间的信息,每次触发异常时,您只需要使与异常相关的信息无效即可。
然后,您需要继续循环直到所有值都经过验证并且可以格式化值为止,例如...
import java.util.Scanner;
public class ParseDate {
public static void main(String args[]) {
String day = null;
String month = null;
String year = null;
String format = null;
Scanner input = new Scanner(System.in);
do {
if (day == null) {
System.out.println("Enter the day: ");
day = input.nextLine();
}
if (month == null) {
System.out.println("Enter the month: ");
month = input.nextLine();
}
if (year == null) {
System.out.println("Enter the year: ");
year = input.nextLine();
}
try {
format = formatDate(month, day, year);
} catch (MonthException m) {
System.err.println(month + " is not a valid month");
month = null;
} catch (DayException d) {
System.err.println(day + " is not a valid day");
day = null;
} catch (YearException y) {
System.err.println(year + " is not a valid year");
year = null;
}
} while (format == null);
}
public static String formatDate(String month, String day, String year)
throws MonthException, DayException, YearException {
String output = "Happy";
int monthNum = 0;
int dayNum = 0;
int yearNum = 0;
try {
monthNum = Integer.parseInt(month);
if (monthNum < 1 || monthNum > 12) {
throw new MonthException("Invalid month. reenter.");
}
} catch (NumberFormatException exp) {
throw new MonthException("Invalid month. reenter.");
}
try {
yearNum = Integer.parseInt(year);
if (yearNum < 1000 || yearNum > 3000) {
throw new YearException("Invalid year. reenter.");
}
} catch (NumberFormatException exp) {
throw new YearException("Invalid year. reenter.");
}
try {
dayNum = Integer.parseInt(day);
// You need to take into consideration the actual month,
// but I'll leave that to you...
if (dayNum < 1 || dayNum > 31) {
throw new DayException("Invalid day. reenter.");
}
} catch (NumberFormatException exp) {
throw new DayException("Invalid day. reenter.");
}
//other code here for converting date
return output;
}
public static class MonthException extends Exception {
public MonthException(String message) {
super(message);
}
}
public static class DayException extends Exception {
public DayException(String message) {
super(message);
}
}
public static class YearException extends Exception {
public YearException(String message) {
super(message);
}
}
}
坦率地说,现在单独验证每个对象会更简单,但这就是我
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.