【问题标题】:Inputing Integers error throwing输入整数错误抛出
【发布时间】:2014-02-23 05:28:32
【问题描述】:

谁能帮我把这段代码弄得更整洁。我宁愿使用 parse int 而不是缓冲区阅读器。我希望我的代码循环,直到用户输入一个数字。如果代码不打印两次相同的语句,我无法弄清楚如何做到这一点。

public void setAge() 
{
    try {
        age = Integer.parseInt(scan.nextLine());
    } catch (NumberFormatException e) {
        System.out.println("What is your age?");
        this.setAge();
    }
}

好的,我的问题不清楚。当您不输入整数时,我不确定如何处理扫描仪抛出的错误。我该如何处理?我在另一篇文章中发现了“NumberFormatException”,但我不确定这是做什么的。谁能帮我解决这个问题,还是我的问题还不清楚?

【问题讨论】:

  • 如果你使用ScannernextInt方法并且输入不是一个int,它会抛出一个InputMismatchException。检查我的答案,看看是否是您需要的。

标签: java input error-handling integer try-catch


【解决方案1】:

试试这个:

import java.util.InputMismatchException;
import java.util.Scanner;

public class TestScanner {

  public static void main(String[] args) {

    Scanner scanner = null;
    int age = -1;
    do {
      try {
        scanner = new Scanner(System.in);
        System.out.println("What is your age?");
        age = scanner.nextInt();
      } catch (InputMismatchException e) {
        System.out.println("Please enter a number!");
      }
    } while (age == -1);
    System.out.println("You are " + age + " years old.");

    if (scanner != null)
      scanner.close();
  }

}

我得到这个输出(我第一次输入 abc 而不是一个数字让它重试):

What is your age?
abc
Please enter a number!
What is your age?
35
You are 35 years old.

玩得开心!

【讨论】:

  • 谢谢,这就是我要找的!
  • 太棒了!我一直很欣赏完整、有效的代码示例,因此我也尝试在我的答案中提供它们。很高兴您发现这很有用!
  • 我有一个问题要问你。我从未编写过 if 语句来检查扫描仪是否为空。这是为了什么,scanner.close() 的目的是什么?
  • 在这种情况下可能没有必要,但这是我习惯于使用扫描仪等资源的编码习惯。 close() 是为了防止资源泄漏,虽然对于这个简单的程序来说不是必需的,因为当 main 终止时,整个程序会超出范围,但是以这种方式关闭所有资源是一个很好的编程习惯。跨度>
【解决方案2】:

使用scan.nextInt(); 而不是scan.nextLine();

有了这个,你就不需要解析行了。

编辑:哎呀,我看错了你的问题

【讨论】:

  • 什么是nestLine() ??
  • 你知道如何处理这个抛出的错误吗?
  • @JohnFriedrich 你输入了什么号码?
  • 你可以给我们使用Scanner.hasNextInt()while (!scan.hasNextInt()) scan.next(); int age = scan.nextInt();
【解决方案3】:

当程序员试图将字符串转换为数字时,Java 代码中会出现数字格式异常。 Number 可能是 int、float 或任何 java 数值。

转换由函数 Integer.parseInt.Consider 完成会发生

【讨论】:

    【解决方案4】:

    您可以使用扫描仪。 你需要;

    import java.util.*;
    
    static Scanner console = new Scanner(System.in);
    

    您根本不需要 parse 语句。

    age = console.nextInt();
    

    编辑:在看到您的编辑后编辑我的答案。

    我会将整个尝试放在一个 do 循环中。使用新的布尔变量来控制何时退出。

    boolean excep;
    
    do {
    excep = false;
    try {
    age = console.nextInt();
    }
    catch (Exception exRef) {
    System.out.println("Please input an integer");
    console.nextLine();
    excep = true; 
    }
    } while (excep);
    

    console.nextLine() 只是清除一行,因此它不会重新读取最后一个输入。有时它是需要的。 使用它,我在运行它时不会收到任何错误通知。

    【讨论】:

      【解决方案5】:

      试试这个:

      static boolean firstTime = true;
      
      public static void main(String[] args) {
      
          boolean firstTime = true;
          setAge();
      }
      
      public static void setAge() 
      {
          if(firstTime)
          {
              System.out.println("What is your age?");
              firstTime = false;
          }
      
          Scanner scan = new Scanner(System.in);
      
          try{
              int age = scan.nextInt();
              System.out.println(age);
          }
          catch(InputMismatchException e)
          {
              setAge();
          }       
      }
      

      【讨论】:

        【解决方案6】:

        如果您想打印不同的消息,您必须这样做:

        import java.util.Scanner;
        

        公开课号{

        public static void main(String args[]) {
            Numbers numbers = new Numbers();
            numbers.setAge();
        }
        
        private boolean alrearyAsked = false;
        private int age = 0;
        static Scanner scan = new Scanner(System.in);
        public void setAge() 
        {
            try {
                age = scan.nextInt();
            } catch (NumberFormatException e) {
                if (alrearyAsked) {
                    System.out.println("you typed a wrong age, please try again.");
                }
                else {
                    System.out.println("What is your age?");
                }
                this.setAge();
            }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2020-12-24
          • 2016-08-17
          • 2020-06-28
          • 1970-01-01
          • 2023-04-05
          • 2018-01-09
          • 1970-01-01
          • 2022-07-11
          • 2013-10-22
          相关资源
          最近更新 更多