2011-12-08 114 views
1

以Java編寫下面的代碼:爲什麼我的switch語句有這麼奇怪的行爲?

choice = keyboard.nextByte(); 

     switch (choice) 
     { 
      case (byte) 4: 
       System.out.print("Input the layout type: "); 
       layoutType = keyboard.nextLine(); 
       System.out.print("Input the layout name: "); 
       layoutName = keyboard.nextLine(); 
       break; 
      default: 
       break; 
     } 

當我運行程序時,我得到如下:

輸入的佈局類型:輸入佈局名稱:

我得到一次提示兩個輸入!這是爲什麼?該程序不應該停在它說「keyboard.nextLine()」的地方嗎?它是在switch聲明之外進行的,但不在其內部。爲什麼在switch聲明中提示用戶輸入內容會導致這種奇怪的行爲?

=================================== UPDATE:

是的,這是正確的。 keyboardjava.util.Scanner類的一個實例。

+1

什麼是鍵盤? – korifey

+1

你可以顯示鍵盤對象的聲明嗎? – jefflunt

+0

一些問題不清楚的地方。請細化它,其次,Case應該是Int,這就是我猜想的,它不應該是BYTE –

回答

2

這是因爲您正在輸入換行符以讀取字節,並且換行符以某種方式被視爲後續調用readLine()的輸入。添加一個虛擬readLine()readByte()後,解決這個問題:

choice = keyboard.nextByte(); 
keyboard.readLine(); // dummy readline 
1

假設keyboardjava.util.Scanner對象,問題出在下面。

首先,您使用nextByte()讀取一個字節,因此只有字節值被用作輸入。剩下的值,在你的情況下,換行符保留在輸入流中。它被keyboard.nextLine()讀取並返回。因此,該行將返回空字符串。因此,您可能需要撥打額外的nextLine()來呼叫放棄該新行,如下所示:

System.out.print("Input the layout type: "); 
keyboard.nextLine(); 
layoutType = keyboard.nextLine(); 
System.out.print("Input the layout name: "); 
layoutName = keyboard.nextLine(); 
相關問題