首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果输入在Java中无效,则为例外。以年龄为例

如果输入在Java中无效,则为例外。以年龄为例
EN

Stack Overflow用户
提问于 2018-09-25 08:00:12
回答 2查看 2.7K关注 0票数 1

我想抛出一个异常,以便让用户知道年龄值输入应该在1到120之间。在下面的例子中可以找到。

有更好的方法来抛出异常吗?

代码语言:javascript
复制
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;
    }
}
代码语言:javascript
复制
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());
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-25 08:04:33

条件不对。您只希望在范围介于0120的情况下设置年龄。

代码语言:javascript
复制
if (age >= 0 && age < 120) {
    this.age = age;
} else throw new IllegalArgumentException("Age can not be negative or more than 120");

或者(请注意更改的||运算符,意思是):

代码语言:javascript
复制
if (age < 0 || age >= 120) {
    throw new IllegalArgumentException("Age can not be negative or more than 120");  
}
this.age = age;

在错误的输入上抛出异常本身是完全有效的。

票数 2
EN

Stack Overflow用户

发布于 2018-09-25 08:30:04

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

A)错误条件

你的情况不对。您希望在完全相反的情况下抛出异常:

代码语言:javascript
复制
if(age < 0 || age >= 120) {
   // Throw exception
}

( @Nikolas在早些时候的一篇文章中也指出了这一点)

B)通过合同进行设计的显式

我会通过提供一个断言-方法来明确这一点:

代码语言:javascript
复制
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)使用库

有很多的断言方法来检查预条件,这就形成了大量的样板代码.您可以让一个库来处理这个问题(例如,谷歌番石榴):

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52493321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档