如何在编译期间捕获异常

时间:2017-03-22 22:56:18

标签: java exception compilation

您好我是一名初学程序员,我只是在学习Java中的异常,而我所了解的内容已经过自学,但尚未在课堂上介绍过。我希望有一个简单的方法,只接受4个特定的字符串作为输入,否则不起作用。我现在拥有的是这样的:

public void setRating(String rating){
    switch (rating){
        case "G":
        case "PG":
        case "R":
        case "NR":  this.rating = rating;
                    break;
        default:    throw new IllegalArgumentException();
    }
}

这样可以正常工作,但如果我写了无效代码,例如:

setRating("invalid");

我的代码编译并且在我尝试运行它之前不会发送错误消息。

我的问题是:有没有办法写这个,以便在编译时捕获它?在我看来,在此过程中,允许无效代码进行编译会导致使用我的代码的人头疼。不确定这是否是一个愚蠢的问题,甚至是我应该担心的事情,但任何见解都会非常感激!

3 个答案:

答案 0 :(得分:3)

使用enum,以便以编译器理解的方式定义允许值。

public enum Rating {
    G, PG, R, NR
}
public void setRating(Rating rating){
    this.rating = rating;
}
setRating(Rating.G);

答案 1 :(得分:1)

您可以在Oracle tutorial中详细了解例外情况。但简而言之,您的问题“如何在编译期间捕获异常”的答案是“没有办法做到”。仅在运行时抛出异常,通知您在程序执行期间出现了错误。

因此,如果您想限制setRating()方法可以接受的可用值列表,请按照 4castle的回答。

答案 2 :(得分:-1)

所有Checked Exception都会在编译时捕获,但正如您在代码中看到的那样,

i => i.Id?.Replace("-", "").PadLeft(9, '0')

这是一个未经检查的异常(Runtime),所以编译器说,你知道吗?我想你知道该怎么做,如果你想抓住它就可以了,如果不是它对我来说是合适的。

正如您在开关中看到的那样,如果值与

不同
        default:    throw new IllegalArgumentException();

你试图表示一个RuntimeException所以如果你抓到它就好了,如果你想抓住它,你必须知道:

enter image description here

现在您可以像这样更改代码:

case "G":
        case "PG":
        case "R":
        case "NR"

所以我抓住了例外。

或使用枚举,因此您只需让用户使用您所做的选项,而不是不允许使用的选项。

希望它有所帮助。