当前位置: 首页 > 知识库问答 >
问题:

我可以尝试在setters中捕获异常吗?如果是这样,我如何正确地这样做?

邰建业
2023-03-14

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

导入java。util。扫描仪;

公共课主课{

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。输入不匹配异常;导入java。util。扫描仪;

公共类测试病人{private int age;

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;
}

}

共有2个答案

和丰羽
2023-03-14

当您将数据结构代码(例如,患者类别)与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对象,这是一件危险的事情,因为如果扫描器基于系统。如果关闭,则程序无法再从用户处获取输入。

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

例如,

    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;
    }   
宿衡虑
2023-03-14

使用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;
}
 类似资料:
  • 问题内容: 我们已经从软件供应商处收到Java代码。它包含许多没有任何部分的块。他们到处都是。例: 我的问题是:以上做法是否可以接受?如果是这样,什么时候?还是我应该继续删除所有这些“虚假” 和陈述? 对我来说,这看起来像是可怕的练习,但是我对Java的经验不足以肯定。如果您不打算对它们做任何事情,为什么会发现它们呢?在我看来,仅当您确信例外绝对不会有后果并且您不在乎是否发生例外时,您才这样做。但

  • 问题内容: 我需要捕捉一些从PHP本机函数抛出的警告,然后处理它们。 特别: DNS查询失败时,它将引发警告。 / 不起作用,因为警告也不例外。 我现在有2个选择: 似乎有点过分,因为我必须使用它来过滤页面中的每个警告(这是真的吗?); 调整错误报告/显示,以使这些警告不会在屏幕上显示,然后检查返回值;如果为,则找不到主机名的记录。 这里的最佳做法是什么? 问题答案: 设置和还原错误处理程序 一种

  • 问题内容: 如果某些东西无法正常工作,或者某些插件未在我的Eclipse中正确加载,我通常会建议您以干净模式打开Eclipse。 那么,如何在干净模式下运行?如果我这样做会怎样? 问题答案: 它能做什么: 如果设置为“ true”,则OSGi框架和eclipse运行时使用的所有缓存数据都将被清除。这将清除用于存储捆绑包依赖关系解析和Eclipse扩展注册表数据的缓存。使用此选项将强制eclipse

  • 我的工作笔记本电脑运行LinuxMint作为基本操作系统,加上Virtualbox来运行Windows 7,这是实际的工作环境,通常加上一个额外的Virtualbox VM来运行不同的Windows安装,我在其中做我的客户机项目工作(我每个客户机有一个VM,以避免弄乱我的主操作系统)。 但我想知道,在客户项目中使用Docker是否可行和有益?也就是说,我想保留LinuxMint(以保持我的理智),

  • 我一直在看《破解编码面试》(5E,119页)一书中的分区函数。我将其复制如下: 给定此数组: 1 2 3 3 5 6 4 左=4,右=4。退出 然而,我最后得到的数组是:

  • 问题内容: 由于可以直接从类(即ClassName.methodName)中调用静态方法,因此为什么需要使用该类的对象来调用静态方法? 如果有人知道的话,请举例说明。 问题答案: 以下代码包含一个示例,其中通过引用调用了静态方法。 由于是静态方法,因此表达式与相同。因此,在运行时不会抛出异常。