2017-02-20 17 views
1

Создание java-программы, которая получает вход от пользователя, должна быть типа «byte» и в интервале [0,8]. Я использую метод, чтобы сначала проверить, является ли вход байтом, а затем, если true, проверьте, соответствует ли байт в интервале и затем возвращает это значение моему основному методу.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 (включительно)

Так что если вы хотите, чтобы проверить, если значение байта, вы можете использовать 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. Java имеет операторы сдвига бит, которые делают это выполнимым в одной строке.

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

Да, это может сработать, но я хотел, чтобы реализация избегала всех других входов, возможно, пользователь вводит строку или поплавок ... поэтому он может распечатать сообщение, чтобы исправить его. Поскольку ваш ожидает целое число, ему понадобится бросок для работы, поскольку я хочу ... –

+0

Причина, по которой я рекомендовал int, состоит в том, что байт Java буквально является 8-битным целым числом. Конечно, это работает, только если вы можете предположить, что вход всегда будет int. В случае, если вы не можете этого принять, вы можете использовать 'try {byte b = Byte.parseByte (scan.nextLine());} catch (NumberFormatException e) {System.out.println (« не байт »); } 'Таким образом, вы всегда можете анализировать данные со сканера, и вы можете определить, является ли это байтом или нет, основываясь на том, выбрано ли исключение или нет. – kreinerjm

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