2017-02-20 87 views
1

創建一個獲取用戶輸入的Java程序,它必須是類型'字節',並且在區間[0,8]中。 我正在使用一種方法來首先檢查輸入是否是一個字節,然後如果這真的檢查該字節是否適合間隔,然後將該值返回給我的主要方法。Java - 掃描儀站立空閒

public static byte GetShiftedLeft(){ 
     byte l = GetByte(SHIFT_L_MSG); 
     while (l < 0 || l > 8){ 
     System.out.println(l + " is not between the range"); 
     l = GetByte(SHIFT_L_MSG); 
     } 
     return l; 
    } 
    public static byte GetShiftedRight(){ 
     byte r = GetByte(SHIFT_R_MSG); 
     while (r < 0 || r > 8){ 
     System.out.println(r + " is not between the range"); 
     r = GetByte(SHIFT_R_MSG); 
     } 
     return r; 
    } 
    public static byte GetByte(String prompt){ 
     System.out.print(prompt); 
     Scanner stdin = new Scanner(System.in); 
     while (!stdin.hasNextByte()){ 
     System.out.println("*** "+stdin.next() + " is not a byte ***"); 
     System.out.print("Try again\n"+prompt); 
     stdin.next(); 
     } 
     return stdin.nextByte(); 
    } 

當我運行程序檢查它,如果第一輸入不是一個字節,但隨後的下一個輸入是一個字節,但不適合在間隔中,該消息不顯示和掃描儀閒置。

輸出運行:

enter #left-shift bits in the interval [0,8]: 145 
*** 145 is not a byte *** 
Try again 
enter #left-shift bits in the interval [0,8]: 12 


4 
enter #right-shift bits in the interval [0,8]: 12 
12 is not between the range 
enter #right-shift bits in the interval [0,8]: 11 
11 is not between the range 
enter #right-shift bits in the interval [0,8]: 10 
10 is not between the range 
enter #right-shift bits in the interval [0,8]: 789 
*** 789 is not a byte *** 
Try again 
enter #right-shift bits in the interval [0,8]: 12 

然後,它只是站在那裏...作爲線5 & 6從輸出

+0

爲什麼要調用'stdin.next()'兩次? – shmosel

+0

我打電話給它兩次,第一次打印輸入給出告訴用戶它不是一個字節,第二次告訴程序期待另一個輸入。據我現在瞭解,它可以完成只是第一個,它工作得很好 –

回答

0

你stdin.next()的兩倍,因此在輸入時789,預計另一個輸入,然後是另一個輸入。

0

一個字節,根據在Oracle文檔:

是一個8位符號的二進制補碼整數。它的最小值爲-128,最大值爲127(含)(最高值爲012)

因此,如果您想檢查該值是否爲字節,則可以使用Scanner.nextInt()。

public boolean isByte(int n) 
{ 
    if(n >= 128 && n <= 127) 
    { 
     return true; 
    } 
    return false; 
} 

public byte getByte() 
{ 
    Scanner scan = new Scanner(System.in); 
    System.out.print("Enter a byte here: "); 
    int nextInt = scan.nextInt(); 
    System.out.println(); 
    if(isByte(nextInt)) 
    { 
     byte b = (byte) nextInt; 
     if(b > 0 && b < 8) 
     { 
      System.out.println("Got byte "+b); 
      return b; 
     } 
     else 
     { 
      System.out.println("Not in range [0,8]!! Try again!!"); 
      return getByte(); 
     } 

    } 
    else 
    { 
     System.out.println("Not a byte!! Try again!!"); 
     return getByte(); 
    } 
} 

然後,如果我正確地理解你的問題,你試圖將該字節左移或右移一個給定的數字n。爪哇有位移操作符,這使得這一行可行。

byte b = 105; 
b << n; //bit shift n to the left 
b >> n; //bit shift n to the right 
+0

是的,可以解決,但我希望執行,以避免所有其他輸入太多,也許用戶輸入一個字符串或浮動...所以它可以打印出消息來糾正它。隨着你的期望一個整數,它將需要一個投擲工作,因爲我想... –

+0

我推薦int的原因是因爲Java字節字面上是一個8位整數。當然,這隻有在你可以假設輸入總是一個整數的情況下才有效。如果你不能假設,你可以使用'try {byte b = Byte.parseByte(scan.nextLine());} catch(NumberFormatException e){System.out.println(「not a byte」); }'這樣你總是可以解析掃描器中的數據,並且可以根據異常是否被拋出來確定它是否是一個字節。 – kreinerjm