Java 我可以尝试在setter中捕获异常吗?如果可以,我如何正确执行?

Java 我可以尝试在setter中捕获异常吗?如果可以,我如何正确执行?,java,intellij-idea,methods,getter,setter,Java,Intellij Idea,Methods,Getter,Setter,我想要做的是让用户输入年龄,让程序在检查异常的同时使用getter和setter,如果它捕捉到异常,它必须再次运行该方法 导入java.util.Scanner 公共班机{ public static void main(String[] args) { Scanner in = new Scanner(System.in); TestPatient patientZero = new TestPatient(); patientZero.setAge(in.nextIn

我想要做的是让用户输入年龄,让程序在检查异常的同时使用getter和setter,如果它捕捉到异常,它必须再次运行该方法

导入java.util.Scanner

公共班机{

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    TestPatient patientZero = new TestPatient();
    patientZero.setAge(in.nextInt());
    System.out.println(patientZero.getAge());

}

}
// 病人类别

导入java.util.InputMismatchException; 导入java.util.Scanner

公共类受试者{ 私人互联网

public int getAge(){
    return age;
}

public void setAge(int newAge){
    Scanner in = new Scanner(System.in);
        int age;
        boolean success = false;
        try {
            System.out.print("Enter in Your age:");
            age = in.nextInt();
            success = true;
        } catch (InputMismatchException ex) {
            System.out.println("Im sorry, please enter just you age.\nTry again");
        }
    this.age=newAge;
}

}

使用
while
循环。在读取用户输入时,也不需要
newAge
参数

public void setAge(){
    int age;
    Scanner in = new Scanner(System.in);
    boolean success = false;
    while (!success) {
        try {
            System.out.print("Enter in Your age:");
            age = in.nextInt();
            success = true;
        } catch (InputMismatchException ex) {
            success = false;
            System.out.println("Im sorry, please enter just you age.\nTry again");
        }
    }
    this.age=age;
}

当您将数据结构代码(如患者类别)与I/O代码(如扫描仪输入代码)混合使用时,您的整体程序结构可能会得到改进。这些代码应完全分开,例如:

public class TestPatient { 
    private int age;

    public int getAge(){
        return age;
    }


    public void setAge(int newAge) {
        this.age = newAge;
    }

}
然后I/O可以转到其他地方:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    // get your data here and create your new TestPatient
    
}    
为什么这很重要?您事先不知道最终将如何使用主代码,并且需要保持它的开放性和灵活性,以便在任何I/O情况下使用,包括GUI(如果需要)

此外,您的代码将为每个setter调用创建一个新的Scanner对象,这是一件危险的事情,因为如果基于System.in的Scanner被关闭,那么程序将无法再从用户处获取输入

还请注意,如果不允许传入数据,则可以从setter方法引发异常

e、 g

public void设置(int newAge){

if(newAge)我不明白为什么要将
newAge
传递到
setAge()
中,然后提示用户输入一个未使用的年龄。不要将用户界面(UI)代码与数据结构类(例如,患者类)混合使用。它们应该完全分开来澄清你的意思:在主类中获取数据,然后根据需要创建我的新患者?@zackeryTarantino:也许在主类中,或者在单独的I/O类中,但无论如何,它都应该与你的结构类分开。没有必要把你自己画进一个角落
    public void setAge(int newAge) {
        if (newAge <= 0) {
            String text = "for newAge is less than or equal to 0: " + newAge;
            throw new IllegalArgumentException(text);
        }
        this.age = newAge;
    }