2017-02-20 29 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