我自己练习了一些 Java SE 7,遇到了以下问题。我编写了一个 public static void 函数 ValidDate,它接受三个字符串,并且仅在日期无效时抛出断言错误。 ValidDate 使用两个字符串数组(MONTHS 和DAYS)作为库来验证给定的日期。 ValidDate 在每个断言测试结束时也有一个唯一的断言表达式:
public static void ValidDate(String month, String day, String year){
boolean validday = false;
boolean validmonth = false;
boolean validyear = true;
try{
Integer.parseInt(year);
}catch(NumberFormatException e){
validyear = false;
}
assert(validyear): "Error: year entry not written in integers.";
for(String m:MONTHS){
if(m.equals(month)){
validmonth = true;
}
}
assert (validmonth): "Error: month entry is not valid; must be an"
+ " integer between (0)1 and 12.";
...
}
我的目的是为我的公共(public)类 Person< 添加 ValidDate 作为 DOB setter (SetDOB) 的帮助函数/em>。当在 setter 中输入无效的 DOB 时,ValidDate 将抛出异常,然后 SetDOB 将输出一条消息,指出输入的 DOB 是 Not Acceptable ,不会更改当前的 DOB 值:
public void SetDOB(String newDOB){
String[] dates = newDOB.split("/");
boolean validdate = true;
if(dates.length == 3){
try{
ValidDate(dates[0],dates[1],dates[2]);
}
catch(AssertionError e){
System.out.println("Error: ValidDate threw an assert error.");
validdate = false;
}
if(validdate){
DOB = newDOB;
}
}
else{
System.out.println("Please enter a valid DOB of the form: Month/Day"
+ "/Year using integers.");
}
}
当我尝试使用无效的 DOB 运行 SetDOB 时,ValidDate 不会为 SetDOB抛出 AssertionError em> catch 。也没有输出错误消息。我怀疑造成这种情况的原因与我在 ValidDate 或 SetDOB 中使用 try-catch 语句有关。但是,我也可能在没有意识到的情况下犯了一个不同的错误。我希望有人解释我做错了什么以及如何正确完成我的预期任务。如果其他人已经回答了这个或类似的问题,请在他们的帖子中添加一个链接。如果我在遇到链接的帖子时发现它多余,我也可能会删除它。
最佳答案
但是,真正的问题是您误解了断言的目的。它们不是表示在执行程序的过程中出现了错误,而是表示您对代码的假设是错误的。
当你写这样的东西时
assert someValue != null : "some value should be set"
这意味着您以这样一种方式编写了代码,即 someValue
以一种或另一种方式设置,并且在代码到达 assert
时 必须设置。如果有人修改您的代码,使其可以在不设置 someValue
的情况下到达 assert
,断言将捕获它。
另一方面,您的代码尝试使用断言进行验证。这就是异常(exception)的用途:
if (!validmonth) {
throw new InvalidMonthException("Error: month entry is not valid; must be an integer between (0)1 and 12.");
}
注意:您的代码未捕获断言的最可能原因是您 have not enabled them .
关于Java 捕获哪个断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081894/