您好我是一名初学程序员,我只是在学习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");
我的代码编译并且在我尝试运行它之前不会发送错误消息。
我的问题是:有没有办法写这个,以便在编译时捕获它?在我看来,在此过程中,允许无效代码进行编译会导致使用我的代码的人头疼。不确定这是否是一个愚蠢的问题,甚至是我应该担心的事情,但任何见解都会非常感激!
答案 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所以如果你抓到它就好了,如果你想抓住它,你必须知道:
现在您可以像这样更改代码:
case "G":
case "PG":
case "R":
case "NR"
所以我抓住了例外。
或使用枚举,因此您只需让用户使用您所做的选项,而不是不允许使用的选项。
希望它有所帮助。