2015-11-15 1 views
0
public static void main(String[] args) { 

    Scanner consoleScanner = new Scanner(System.in); 

    int hour = 0; 
    int minute = 0; 
    String meridiem = ""; 
    String zero = ""; 
    boolean errorOccured = false; 

    do { 

     try { 
      System.out.print("Please enter the hour:"); 
      hour = consoleScanner.nextInt(); 
      System.out.println("Please enter the minute:"); 
      minute = consoleScanner.nextInt(); 
      if (minute <= 9) 
       zero = "0"; 
      System.out.println("Please enter either \"AM\" or \"PM\":"); 
      meridiem = consoleScanner.nextLine(); 

      if (hour < 1 || hour > 12) { 
       throw new InvalidHourException(); 
      } 
      if (minute < 0 || minute > 59) { 
       throw new InvalidMinuteException(); 
      } 
      if (!meridiem.equals("AM") || !meridiem.equals("PM")) { 
       throw new InvalidMeridiemException(); 
      } 

     } catch (InvalidHourException hourEx) { 
      System.out.println(hourEx.getMessage()); 
     } catch (InvalidMinuteException minuteEx) { 
      System.out.println(minuteEx.getMessage()); 
     } catch (InvalidMeridiemException meriEx) { 
      System.out.println(meriEx.getMessage()); 
     } 

    } while (errorOccured); 

    System.out.println(hour + ":" + zero + minute + meridiem + " is a valid time."); 

} 

}Почему мой код перескакивает на часть catch?

Мой вывод выглядит:

Пожалуйста, введите час: 1 Пожалуйста, введите минуту: 3 Пожалуйста, введите либо "AM" или "PM": Пожалуйста, введите либо AM или ВЕЧЕРА. 1:03 - допустимое время.

Мне было интересно, почему это не позволяет мне настроить AM или PM и просто прыгать на исключение?

ответ

1

Это условие всегда будет сгенерировано исключение, так как meridiem не может быть равно как "AM" и "PM":

 if (!meridiem.equals("AM") || !meridiem.equals("PM")) { 
      throw new InvalidMeridiemException(); 
     } 

Оно должно быть:

 if (!meridiem.equals("AM") && !meridiem.equals("PM")) { 
      throw new InvalidMeridiemException(); 
     } 
+0

FGITW эффекта опять ... :( – Arc676

+0

привета не || среднего или хотя так, как если бы его не равно AM или PM затем бросить исключение Может вам. объясните мне более подробно о && part? – elequang

+0

@elequang '||' означает или, поэтому, если meridiem не равно AM или meridiem не равен PM, вы генерируете исключение. Правильное условие также может быть сформулировано как 'if (! (meridiem.equals (" AM ") || meridiem.equals (" PM ")))'. – Eran

0

Помимо вещей что @Eran сказал, также вы должны изменить это

meridiem = consoleScanner.nextLine(); 

meridiem = consoleScanner.next(); 

Причина: nextLine продвигает этот сканер мимо текущей строки и возвращает вклад, который был пропущен, а последующие Находки и возвращает следующий полный маркер из этого сканера.

увидеть это более подробное объяснение: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

Смежные вопросы