2013-10-05 4 views
0

Я знаю, что на этом сайте уже много вопросов, но я все еще не могу его повесить в моей программе.проверка, если вход сканера как положительное целое

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, это работает, но это не достаточно хорошо для меня, потому что не могу проверить для двойных входов, ни пустых входов.

+0

Если вы определили, что следующее слово не является числом, тогда нет смысла пытаться прочитать число. Я предлагаю сделать 'user_input.nextLine();' –

+0

a% 3600% 60 = a% 60 –

+0

Тогда не используйте 'nextInt' и используйте' nextDouble() 'или' nextLine() ' – nachokk

ответ

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

    } 
} 
+0

спасибо за ваш ответ :) Я нахожу код понятным, но у меня есть один вопрос: есть причина, по которой вы устанавливаете sec = -1 или это просто случайное число, которое я могу заменить любыми другими цифрами? – ymc331

+0

@ ymc331 На самом деле есть причина, заключается в том, что вы читаете положительное целое число, позже мы проверяем, что в 'if (sec> 0)', если вы ничего не читаете, инструкция 'while' также заканчивается, но 'sec' равно -1, поэтому мы должны быть уверены – omainegra

+0

@ ymc331 -1 просто случайное число, которое я могу заменить любым другим ** отрицательным ** номером – omainegra

0

Вы часто можете сделать вещи проще с помощью "Divide & властвуй" подход. В этом случае с помощью функции, чтобы прочитать пользовательский ввод должным образом упрощает задачу много:

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, поэтому вашей основной функции не нужно беспокоиться об этом, она может просто использовать значение и предположить, что оно правильно. Вы также можете добавить дополнительные проверки, например> 0, если хотите, я пропустил их для простоты. Поскольку сканирование происходит внутри функции, вы можете «выпрыгнуть» с помощью возврата, как только у вас есть правильное значение, что решает большую сложность.

Кроме того, это делает ваш код более легким для чтения, исправления и повторного использования.

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"); 

} 
} 
+0

благодарю вас за то, что вы показали мне сложное решение. Это просто, что на данный момент я не могу понять большинство кодов, которые вы использовали, например, catch, try и т. Д., Но я попытаюсь понять это через некоторое исследование :) – ymc331

+0

спасибо большое;), я очень рад, что я мог бы вам помочь, и голосование по моему ответу будет действительно оценено: D –

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 фиксировал его.

0

Вам нужно прочитать ввод пользователя в виде строки - не обойти это, потому что вы должны иметь возможность обрабатывать недопустимый ввод. Итак, вам необходимо:

String input = scanner.next(); 

Что касается проверки, это зависит от того, что вы подразумеваете под «integer».

Если это означает, что обычное значение «целого числа», вы можете проверить, что, как это:

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 
} 
Смежные вопросы