2016-01-16 109 views
0

我在下面編寫的程序被設計爲如果用戶在提示時沒有輸入整數,程序將循環直到它們出現。這適用於初始檢查,但第二次檢查不起作用。代碼如下:使用嵌套的while循環確保類型安全輸入

import java.util.Scanner; 
public class SafeInput 
{ 
    public static void main(String[]args) 
    { 
     System.out.println("Please enter any integer. If you want to exit, enter -1>"); 
     Scanner scan = new Scanner(System.in); 

     while(!scan.hasNextInt()) 
     { 
      String garbage = scan.nextLine(); 
      System.out.println("You've entered garbage."); 
     } 

     int input = scan.nextInt(); 

     while(input != -1) 
     {   
      System.out.println("\nYou entered: "+input); 
      System.out.println("Please enter any integer. If you want to exit, enter -1>"); 

      while(!scan.hasNextInt()) 
      { 
       System.out.println("You've entered garbage."); 
       String garbage1 = scan.nextLine(); 
      } 

      input = scan.nextInt(); 
     } 

     System.out.println("-1 entered. Goodbye"); 
    } 
} 

這裏是當我執行該程序會發生什麼:

Please enter any integer. If you want to exit, enter -1> 
this is a string 
You've entered garbage. 
1 

You entered: 1 
Please enter any integer. If you want to exit, enter -1> 
2 

You entered: 2 
Please enter any integer. If you want to exit, enter -1> 
this is also a string 
You've entered garbage. 
You've entered garbage. 
string 
You've entered garbage. 
1 

You entered: 1 
Please enter any integer. If you want to exit, enter -1> 
2 

You entered: 2 
Please enter any integer. If you want to exit, enter -1> 
-1 
-1 entered. Goodbye 

爲什麼,當我失敗的第二次檢查一個整數,該程序的輸出:

You've entered garbage. 
You've entered garbage. 

相反的:

You've entered garbage. 

謝謝!

回答

0

秒while while循環應該像下面更新。

 while(input != -1) 
     {   
      System.out.println("\nYou entered: "+input); 
      System.out.println("Please enter any integer. If you want to exit, enter -1>"); 
      scan.nextLine(); 
      while(!scan.hasNextInt()) 
      { 
       System.out.println("You've entered garbage"); 
       String garbage1 = scan.nextLine(); 
      } 

      input = scan.nextInt(); 
     } 
+0

這很完美!謝謝!但是,爲什麼這個工作呢?這是如何解決問題的? –

+0

請參閱http://stackoverflow.com/questions/13102045/skipping-nextline-after-using-next-nextint-or-other-nextfoo-methods,並解釋scan.nextLine()在scan.NextInt () – Heshan

0

使用next()而不是nextLine()。

 while(input != -1) {   
       System.out.println("\nYou entered: "+input); 
       System.out.println("Please enter any integer. If you want to exit, enter -1>"); 

       while(!scan.hasNextInt()) 
       { 
        System.out.println("You've entered garbage."); 
        String garbage1 = scan.next(); 
       } 

       input = scan.nextInt(); 
} 

看看掃描器#nextLine()Java文檔,

此方法返回的當前行的其餘部分,不包括在端的任何線路 隔板。該位置設置爲下一條 線的開頭。

見代碼

調試:

while(input != -1) 
    {   
     System.out.println("\nYou entered: "+input); 
     System.out.println("Please enter any integer. If you want to exit, enter -1>"); 

     while(!scan.hasNextInt()) 
     { 
      System.out.println("-- Second -- "); 
      System.out.println("You've entered garbage."); 
      String garbage1 = scan.nextLine(); 
      System.out.println(" garbage1 -> " + garbage1); 
     } 

     input = scan.nextInt(); 
    } 

輸出:

Please enter any integer. If you want to exit, enter -1> 
q 
-- First -- 
You've entered garbage. 
1 
-- input --1 

You entered: 1 
Please enter any integer. If you want to exit, enter -1> 
aa 
-- Second -- 
You've entered garbage. 
garbage1 -> 
-- Second -- 
You've entered garbage. 
garbage1 -> aa 
ab 
-- Second -- 
You've entered garbage. 
garbage1 -> ab 

只是爲了好玩我做了一些 '增強' 的實施。它應該正常工作。

package example; 

    import java.util.Scanner; 

    public class SafeInput { 

     public static void main(String[] args) { 
      System.out.println("Please enter any integer. If you want to exit, enter -1>"); 
      try (Scanner scan = new Scanner(System.in)) { 
       while (true) { 
        int input = 0; 
        String garbageOutput = null; 
        if (scan.hasNextInt() && ((input = scan.nextInt()) != -1)) { 
         System.out.println("\nYou entered: " + input); 
         System.out.println("Please enter any integer. If you want to exit, enter -1>"); 
        } else if (scan.hasNextInt() && ((input = scan.nextInt()) == -1)) { 
         System.out.println("-1 entered. Goodbye"); 
         break; 
        } else if (!scan.hasNextInt() && (scan.hasNextLine()) 
          && (!(garbageOutput = scan.nextLine()).isEmpty())) { 
         System.out.println(String.format("You've entered garbage - [%s]", garbageOutput)); 
        } 
       } 

      } 

     } 

    } 
+0

這隻解決了部分問題。在第二次檢查時,如果我輸入一個字符串,程序將只輸出一次:「你輸入了垃圾」。多個字符串仍然會導致程序輸出:「你輸入了垃圾,你輸入了垃圾。」 –

+0

看到新的實現,它應該正常工作。 – bodo