如果输入在Java中无效,则为异常。例如年龄

Jai*_*e A 1 java validation exception

我想抛出一个异常,以使用户知道年龄值输入应在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;
    }
}
Run Code Online (Sandbox Code Playgroud)
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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Max*_* C. 5

原则上,您在这里所做的是按合同进行设计的一个实例:您正在定义方法的前提条件。

A)错误条件

您的情况不对。您想在完全相反的情况下引发异常:

if(age < 0 || age >= 120) {
   // Throw exception
}
Run Code Online (Sandbox Code Playgroud)

(@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(" ... ");
    }
}
Run Code Online (Sandbox Code Playgroud)

有人会建议使用Java的build in assert关键字。我建议不要这样做,因为在大多数JVM版本中都禁用了它(因此它不会触发)。

C)使用图书馆

有许多断言检查条件的方法,加起来很多样板代码。您可以让一个图书馆来解决这个问题(例如Google的Guava):

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧** A **带来了正确的if子句(我认为这个问题是错误的)。** C **是一个建议。我认为Java验证API可能有点过多。 (2认同)