Java 捕获哪个断言错误

标签 java try-catch assert

我自己练习了一些 Java SE 7,遇到了以下问题。我编写了一个 public static void 函数 ValidDate,它接受三个字符串,并且仅在日期无效时抛出断言错误。 ValidDate 使用两个字符串数组(MONTHSDAYS)作为库来验证给定的日期。 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 catch 。也没有输出错误消息。我怀疑造成这种情况的原因与我在 ValidDateSetDOB 中使用 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/

相关文章:

java - 带有非标准(中文)字符的 showDocument()

java - 向 GUI Java 添加框架

R, tryCatch 错误

c++ - 从谷歌日志库的 CHECK 宏中捕获 C++ 异常

python - 如何在python中测试变量?

ios - 生产构建中的断言导致崩溃

java - java的assert语句可以让你指定消息吗?

java - 如何使用三个变量检查​​两个构造函数是否彼此相等?

c++ - 这个无操作 while 循环用于断言宏的原因是什么?

java - Flex 中没有上传文件