2015-02-01 3 views
1

Может кто-нибудь сказать мне, почему этот бит коды твердит мне Числовой формат Exception и не печатает мое сообщение об ошибке, когда я пытаюсь преобразовать из двоичного числа в десятичное `Как правильно проверить, является ли вход только двоичным номером?

public static void readAndConvertBinaryValue() 
{ 
    Scanner kbd = new Scanner(System.in); 
    boolean valid = false; 
    do 
    { 
     System.out.print("\nEnter a binary value containing up to 16" 
       + " digits: "); 
     bAction = kbd.nextLine(); 
     int result = bAction.compareTo(BINARY_NUM); 
     if (result > 1 || result < -9 || bAction.length() > 16) 
     { 
      System.out.print("Error: Invalid binary value." 
        + "\nTry again.\nPress Enter to continue ..."); 
      kbd.nextLine(); 
     } else 
     { 
      char value; 
      int charlim = 0; 
      value = bAction.charAt(charlim); 
      if (value == '1' || value == '0') 
      { 
       binary = Integer.parseInt(bAction, 2); 
       valid = true; 
      } else 
      { 

       System.out.print("Error: Invalid binary value." 
         + "\nTrya again.\nPress Enter to continue ..."); 
       kbd.nextLine(); 
      } 
     } 
    } while (!valid); 
} 
+1

где код? – Johan

+1

Предлагаю вам проверить все цифры, а не только первую. Я также предлагаю вам проверить, что меньше 33, или это также даст вам исключение NumberFormatException. Простой подход - это не проверка, а вместо этого - исключение NumebrFormatException, если оно происходит. –

+0

Я только что добавил код – midknight

ответ

0

Использование регулярных выражений:

boolean isABinNumber = bAction.matches("^[01]+$"); 

совпадения определены в классе String и возвращают true тогда и только тогда, когда строка соответствует предоставленному регулярному выражению. Регулярное выражение выше (^ [01] + $) охватывает все строки, которые от начала (^) до конца ($) являются последовательностью одного или нескольких (+) 0 или 1s '[01]'.

Если вы не знакомы с регулярными выражениями есть много информации в Интернете (например, a tutorial)

+0

Или 'matches (" [01] {1,32} ")' –

+0

Я не совсем понимаю, что жаль, что я все еще новичок программист – midknight

+1

@PeterLawrey, так как он проверяет максимальную длину 16 32-битных предел не имеет значения. –

1

Все это кажется слишком сложным, просто использовать Integer.parseInt() и поймать NumberFormatException, если это происходит. Затем вы можете проверить, что значение находится в пределах требуемого диапазона.

Scanner kbd = new Scanner(System.in); 
System.out.print("\nEnter a binary value containing up to 16" + " digits: "); 
String bAction = kbd.nextLine(); 
try { 
    int binary = Integer.parseInt(bAction, 2); 
    if (binary >= (1 << 16)) { 
     System.err.println("Binary value out of range"); 
    } 
} catch (NumberFormatException e) { 
    System.out.print("Error: Invalid binary value."); 
} 
+0

Возможно, вы не захотите сбросить ввод строки после ошибки. –

+0

Следуя комментарию @PeterLawrey, возможно, catch должен установить значение false, а сообщение об ошибке отображается за пределами try-catch на основе значения в действительном. –

+0

действительный уже неверен, есть немного смысла в настройке его снова. Я только исправил код в исходной проблеме, а не придумал новые требования ... – Adam

0
import java.util.Scanner; 
import java.util.regex.Pattern; 

public class CheckBinary { 

    public static void main(String[] args) {   

     String binaryNumber = new Scanner(System.in).nextLine(); 
     String binaryPattern = "(1*0*)*"; 

     if(Pattern.compile(binaryPattern).matcher(binaryNumber).matches()) 
      System.out.println("Binary");   
     else 
      System.out.println("Not Binary"); 

    } 

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