我想抛出一个异常,以便让用户知道年龄值输入应该在1到120之间。在下面的例子中可以找到。
有更好的方法来抛出异常吗?
public class Lesson18Encapsulation3 {
private int age;
private String name;
private int salary;
public int getAge() {
return age;
}
public void setAge(int age) {
if ( age < 0 && age >= 120)
this.age = age;
throw new IllegalArgumentException (" age can not be negative or more than 120");
//getters and setters
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}public class Lesson18Encapsulation4 {
public static void main(String[] args) {
Lesson18Encapsulation3 emp = new Lesson18Encapsulation3();
emp.setAge(220);
emp.setName("None");
System.out.println( "age : " + emp.getAge());
System.out.println( "name : " + emp.getName());
}
}发布于 2018-09-25 08:04:33
条件不对。您只希望在范围介于0和120的情况下设置年龄。
if (age >= 0 && age < 120) {
this.age = age;
} else throw new IllegalArgumentException("Age can not be negative or more than 120");或者(请注意更改的||运算符,意思是或):
if (age < 0 || age >= 120) {
throw new IllegalArgumentException("Age can not be negative or more than 120");
}
this.age = age;在错误的输入上抛出异常本身是完全有效的。
发布于 2018-09-25 08:30:04
原则上,您在这里所做的是按合同设计的一个实例:您正在为您的方法定义一个预条件。
A)错误条件
你的情况不对。您希望在完全相反的情况下抛出异常:
if(age < 0 || age >= 120) {
// Throw exception
}( @Nikolas在早些时候的一篇文章中也指出了这一点)
B)通过合同进行设计的显式
我会通过提供一个断言-方法来明确这一点:
private void setAge(int age) {
assertCorrectAge(age);
this.age = age;
}
private void assertCorrectAge(int age) {
if(age < 0 || age >= 120) {
throw new IllegalArgumentException(" ... ");
}
}有些人会建议在assert关键字中使用Java。我建议不要这样做,因为它在大多数JVM版本中都是禁用的(所以不会触发)。
C)使用库
有很多的断言方法来检查预条件,这就形成了大量的样板代码.您可以让一个库来处理这个问题(例如,谷歌番石榴):
public void setAge(int age) {
Preconditions.checkArgument(age >= 0, "negative age: %s", age);
Preconditions.checkArgument(age < 120, "age too high: %s", age);
this.age = age;
}https://stackoverflow.com/questions/52493321
复制相似问题