检查扫描仪输入是否为正整数

时间:2013-10-05 19:06:17

标签: java

我知道网站上已经有很多关于这个问题的问题但是我仍然无法在我的程序中找到它。

import java.util.Scanner;
public class time {
public static void main (String[] args) {
    int a, sec, min, hour;

    System.out.println ("Please enter the number of seconds");
    Scanner user_input = new Scanner (System.in);
    a = user_input.nextInt();

    while (!user_input.hasNextInt()) {
        System.out.println ("Error: INVALID INPUT, please try again");
        System.out.println("Please enter the number of seconds");
        a = user_input.nextInt();
    }

    hour = a/3600;
    min = ((a%3600)/60);
    sec = ((a%3600)%60);

    System.out.println(hour + " hours "+ min+ " minutes " + sec + " seconds");

}
}

所以上面是我的程序。 我刚刚开始学习JAVA所以我尽我所能,但每次运行这个程序,它都没有给我任何东西。

我输入一个数字,但没有任何内容,但程序仍在运行。

奇怪的是......当我改变

!user_input.hasNextInt() 

使用< 0,它可以工作,但这对我来说不够好,因为它无法检查双输入还是空输入。

5 个答案:

答案 0 :(得分:1)

尝试改为:

import java.util.Scanner;

public class time {
    public static void main(String[] args) {
            long sec, min, hour;

            System.out.println("Please enter the number of seconds");
            Scanner user_input = new Scanner(System.in);

            sec = -1;

            while (user_input.hasNextLong() && (sec = user_input.nextLong()) < 0) {
                    System.out.println("Error: INVALID INPUT, please try again");
                    System.out.println("Please enter the number of seconds");
            }

            if (sec > 0) {
                    hour = sec / 3600;
                    min = ((sec % 3600) / 60);
                    sec = ((sec % 3600) % 60);

                    System.out.println(hour + " hours " + min + " minutes " + sec + " seconds");
            }

    }
}

答案 1 :(得分:0)

通过使用“分而治之”方法,您通常可以简化事情。在这种情况下,使用函数正确读取用户输入可以简化任务:

  static int getSecondsFromUser() {
    final Scanner userInput = new Scanner(System.in);

    while (true) {
      System.out.println("Please enter the number of seconds:");
      try {
        return userInput.nextInt();            
      } catch (InputMismatchException e) {
        userInput.skip(".+");
      }
    }
  }

  public static void main(String[] args) {
    final int a = getSecondsFromUser();

    final int hour = a / 3600;
    final int min = ((a % 3600) / 60);
    final int sec = ((a % 3600) % 60);

    System.out.println(hour + " hours " + min + " minutes " + sec + " seconds");
  }

表达式userInput.skip(".+");使用正则表达式.+,表示“一切”。

与函数的“契约”是,它将返回一个正确的int值,因此你的主函数不需要担心,它只能使用该值并假设它是正确的。如果你愿意,你也可以添加像&gt; 0这样的进一步检查,为了简单起见,我跳过了这些。当扫描发生在函数内部时,只要有正确的值,就可以通过返回“跳出”,这样就解决了很多复杂问题。

此外,这使您的代码更易于阅读,修复和重用。

答案 2 :(得分:0)

这将在所有条件下与您合作:

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

public class time{
public static void main (String[] args) {
    int a = 0, sec, min, hour;
    boolean cond = true;

    while(cond){
    boolean mis = false;
    System.out.println ("Please enter the number of seconds");
    Scanner user_input = new Scanner (System.in);
    try{
    a = user_input.nextInt();
    }
    catch(InputMismatchException e){
        System.out.println ("Error: INVALID INPUT, please try again");
        cond = true;
        mis = true;
    }
    if ((a<0 || a != (int)a) && mis == false) {
        System.out.println ("Error: INVALID INPUT, please try again");
       cond = true;
    }
    else if(mis == false){
        cond = false;
    }
    if(cond == false){
        break;
    }
    }
    hour = a/3600;
    min = ((a%3600)/60);
    sec = ((a%3600)%60);

    System.out.println(hour + " hours "+ min+ " minutes " + sec + " seconds");

}
}

答案 3 :(得分:0)

试试这个。通过调用nextLine()而不是nextInt()并尝试解析结果,我们消除了任何错误输入并使程序在任何输入情况下都能运行。

import java.util.*;
public class time
{
    public static void main (String[] args) 
    {
        int time, sec, min, hour;
        String inputString;
        System.out.println ("Please enter the number of seconds");
        Scanner user_input = new Scanner (System.in);
        time = -1;
        inputString = user_input.nextLine();

        try
        {
            time = Integer.parseInt(inputString);
        }
        catch(NumberFormatException e)
        {
            time = -1;
        }

        while (time < 0)
        {
            System.out.println ("Error: INVALID INPUT, please try again");
            System.out.println("Please enter the number of seconds");
            inputString = user_input.next();

            try
            {
                time = Integer.parseInt(inputString);
            }
            catch(InputMismatchException e)
            {
                time = -1;
            }
       }


      hour = time/3600;
      min = ((time%3600)/60);
      sec = ((time%3600)%60);

      System.out.println(hour + " hours "+ min+ " minutes " + sec + " seconds");

  }
}

编辑:IsEmpty()无法正常工作,但将其删除并将时间初始化为-1修复它。

答案 4 :(得分:0)

您需要将用户输入读作字符串 - 因为您必须能够处理无效输入。所以,你需要:

String input = scanner.next();

至于检查,它取决于你所说的“整数”。

如果它意味着“整数”的通常含义,你可以像这样测试:

if (input.matches("\\d+"))
    // it's a (positive) whole number

如果它表示有效的java int值,由于该类型的值范围,这会更复杂。使用:

try {
    int i = Integer.parseInt(input);
    if (I > 0) 
        // input is valid
} catch (NumberFormatException e) {
    // input is not a valid java int
}