使用 try 和 catch 块处理错误
Handling Errors with try and catch blocks
我对处理用户错误的代码有疑问
所以问题是,我需要我的用户添加一个程序的名称,添加该程序在 RAM 中占用的内存,并添加他打开该程序的时间。
我需要在我的代码中添加防御性编程,所以我想也许我可以通过检查用户是否真的添加了程序需要的变量类型来做到这一点。
无论哪种方式,我都对如何使用 try 和 catch 块感到困惑,现在这就是我所拥有的...
System.out.println("add program Id");
String programID = scan.next();
try{
String check;
check = programID;
}catch(Exception e){
System.out.println("add a value of String type");
}
那不行。
任何你可以输入的东西是一个字符串。我可以输入“5”。那是一个字符串。您可能认为它是一个数字,但整个文本块是一个字符串,其中包含“5”。
没有文本也是字符串。 String x = "";
编译正常。
因此,这里永远不会出现异常,并且不清楚您要检测的场景是什么。
可能一个程序 ID 的形式是:“一个大写字母(并且只有英文大写,例如不是 Ü),然后最多 3 个不同的数字”。例如,'Z5' 或 'Y495'.
您需要编写代码来检测这一点,不需要 try/catch。例如,正则表达式:
private static final Pattern PROGRAM_ID_PATTERN = Pattern.compile("^[A-Z]\d{1,3}$");
public static void main(String[] args) {
....
String programId;
do {
programId = scanner.next();
if (!PROGRAM_ID_PATTERN.matcher(programId).matches()) {
System.err.println("Enter a valid program ID, e.g. A123");
} else {
break;
}
} while (true);
}
当一个方法有多种不同的退出方式时会出现异常。
例如,想象一下这个方法:
byte[] contentsOfFile = Files.readFileFully("myfile.txt");
readFileFully
方法看起来很简单:您提供一个文件的名称,它 returns 一个包含其内容的字节数组。
但是,这只是可行的一种方式。如果文件不存在怎么办?如果文件存在,但您的进程没有读取访问权限怎么办?如果磁盘出现故障或者它是可移动驱动器并且在读取过程中被拔出怎么办?
这些有些可预测的潜在替代方法通常由异常完成。例如,该方法将抛出 FileNotFoundException
、noReadAccessException
以及更普遍的 IOException
。
没有 scanner.next()
的 'that is not a string' 变体。
有 scanner.next(Pattern)
可以使用:
private static final Pattern PROGRAM_ID_PATTERN = Pattern.compile("^[A-Z]\d{1,3}$");
public static void main(String[] args) {
....
String programId;
do {
try {
programId = scanner.next(PROGRAM_ID_PATTERN);
break;
} catch (NoSuchElementException e) {
System.err.println("Enter a valid program ID, e.g. A123");
}
} while (true);
}
javadoc 大致解释了可能发生的异常;如果一个方法没有提到任何方法,你不应该在那里try/catch。
我对处理用户错误的代码有疑问
所以问题是,我需要我的用户添加一个程序的名称,添加该程序在 RAM 中占用的内存,并添加他打开该程序的时间。
我需要在我的代码中添加防御性编程,所以我想也许我可以通过检查用户是否真的添加了程序需要的变量类型来做到这一点。
无论哪种方式,我都对如何使用 try 和 catch 块感到困惑,现在这就是我所拥有的...
System.out.println("add program Id");
String programID = scan.next();
try{
String check;
check = programID;
}catch(Exception e){
System.out.println("add a value of String type");
}
那不行。
任何你可以输入的东西是一个字符串。我可以输入“5”。那是一个字符串。您可能认为它是一个数字,但整个文本块是一个字符串,其中包含“5”。
没有文本也是字符串。 String x = "";
编译正常。
因此,这里永远不会出现异常,并且不清楚您要检测的场景是什么。
可能一个程序 ID 的形式是:“一个大写字母(并且只有英文大写,例如不是 Ü),然后最多 3 个不同的数字”。例如,'Z5' 或 'Y495'.
您需要编写代码来检测这一点,不需要 try/catch。例如,正则表达式:
private static final Pattern PROGRAM_ID_PATTERN = Pattern.compile("^[A-Z]\d{1,3}$");
public static void main(String[] args) {
....
String programId;
do {
programId = scanner.next();
if (!PROGRAM_ID_PATTERN.matcher(programId).matches()) {
System.err.println("Enter a valid program ID, e.g. A123");
} else {
break;
}
} while (true);
}
当一个方法有多种不同的退出方式时会出现异常。
例如,想象一下这个方法:
byte[] contentsOfFile = Files.readFileFully("myfile.txt");
readFileFully
方法看起来很简单:您提供一个文件的名称,它 returns 一个包含其内容的字节数组。
但是,这只是可行的一种方式。如果文件不存在怎么办?如果文件存在,但您的进程没有读取访问权限怎么办?如果磁盘出现故障或者它是可移动驱动器并且在读取过程中被拔出怎么办?
这些有些可预测的潜在替代方法通常由异常完成。例如,该方法将抛出 FileNotFoundException
、noReadAccessException
以及更普遍的 IOException
。
没有 scanner.next()
的 'that is not a string' 变体。
有 scanner.next(Pattern)
可以使用:
private static final Pattern PROGRAM_ID_PATTERN = Pattern.compile("^[A-Z]\d{1,3}$");
public static void main(String[] args) {
....
String programId;
do {
try {
programId = scanner.next(PROGRAM_ID_PATTERN);
break;
} catch (NoSuchElementException e) {
System.err.println("Enter a valid program ID, e.g. A123");
}
} while (true);
}
javadoc 大致解释了可能发生的异常;如果一个方法没有提到任何方法,你不应该在那里try/catch。