【问题标题】:Ensuring user input is a double?确保用户输入是双重的?
【发布时间】:2014-10-14 19:42:06
【问题描述】:

使用扫描仪时,有没有办法检查用户输入是否符合我们的预期?

假设我想要一个双精度,但用户输入了一个字符串,我该怎么做才能提示用户重新输入双精度值?

如果未输入数字,则使用以下代码会出现 mismatchException。如果输入错误,我不希望程序崩溃。

这是我的代码: 导入 java.util.Scanner;

public class RoundingNumbers {

  private double y;
  private double x;
  public RoundingNumbers(){
    double y = 0;
    double x = 0;
  }

  public void getNumber(){
    System.out.print("Enter a decimal number: ");
    Scanner num = new Scanner(System.in);
    x = num.nextDouble();
  }

  public void roundNum(){
    y = Math.floor(x + 0.5);
  }

  public void displayNums(){
    System.out.println("The actual number is: " + x);
    System.out.println("The rounded number is: " + y);
  }

}

【问题讨论】:

  • 在 while 循环中捕获 MismatchException。如果该值有效,则将循环的退出值设置为“true”,在异常捕获块中,将其设置为“false”...
  • @MadProgrammer 由于Scanner 类提供了无需捕获异常即可进行检查的方法,因此我更愿意这样做
  • @BackSlash 因为您处理扫描仪异常或解析器异常,您仍在处理异常...
  • @MadProgrammer 我不是在谈论异常。 Scanner 类提供了hasNextDouble() 方法,可以使用该方法代替try-catch。你可以使用if(scanner.hasNextDouble()) myDouble = scanner.nextDouble()。没有try-catch这里

标签: java user-input


【解决方案1】:

您可以将其包装在 try catch 块中。请参阅下面的示例函数。

哎呀。我没有给予足够的关注,也没有看到您的代码示例。

将您的 getNumber() 函数更改为以下定义。请注意,有许多不同的方法可以做到这一点。这只是一个例子。

public void getNumber(){
    Scanner num = new Scanner(System.in);
    while(true) {
        System.out.print("Enter a decimal number: ");
        try {
           x = num.nextDouble();
           break;
       catch(InputMismatchException e) {}
    }
}

【讨论】:

  • OP 已经将值读取为双精度值,最好捕获 nextDouble 引发的异常并在循环中控制它
  • 是的,我没有看到代码。完全隔开。上面的函数和你描述的完全一样。
  • 是的,你的方法没有问题,但 OP 可能会错过他们应该使用 nextLine 而不是 nextDouble
  • 为什么要使用 nextLine?
【解决方案2】:

您已经注意到,如果他们没有输入您期望的内容,您会收到 InputMismatchException。考虑到这一点,您可以用 try-catch 块包围 x = num.nextDouble() 并检查这种异常。例如:

while (true) {
    try {
        x = num.nextDouble();
        // move along if no exception is thrown
        break;
    } catch (InputMismatchException e) {
        // give the user an error message
        System.out.println("Type mismatch when reading your input. Please insert a double: ");
    }
}

顺便说一下,这与您的问题没有直接关系,但您不应将 Scanner 变量命名为 num,因为该名称不会让任何人想到 Scanner - 人们通常会认为这是int 什么的。为变量命名适合它们是一种很好的编程习惯。

【讨论】:

  • 上面的代码创建了一个无限循环。我错过了什么吗?
  • 如果对num.nextDouble()的调用没有抛出异常,程序将到达break并因此结束循环。除非用户永远插入非双精度,否则循环不会是无限的。
  • 我知道如果输入双精度数,它不是无限循环,但如果我只是在错误消息无限重复时输入一个字母。它不允许其他用户输入。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多