【问题标题】:How to properly check if an input is only binary number?如何正确检查输入是否只是二进制数?
【发布时间】:2018-05-04 09:47:48
【问题描述】:

有人能告诉我为什么这段代码在我尝试从二进制数转换为十进制数时一直告诉我数字格式异常而不打印我的错误消息吗?`

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);
}

【问题讨论】:

  • 我建议你检查所有的数字,而不仅仅是第一个。我还建议您检查少于 33 个,否则这也会给您一个 NumberFormatException。一个简单的方法不是不检查,而是在发生 NumebrFormatException 时捕获它。
  • 我刚刚添加了代码
  • 收到错误后放弃读取的下一行。我建议您在调试器中单步调试您的代码,以更好地了解您的代码在做什么?
  • 如何检查所有数字? @PeterLawrey
  • @midknight 您可以使用正则表达式,也可以使用循环。我建议编写一个包含检查的方法。

标签: java binary runtime-error


【解决方案1】:

使用正则表达式:

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

matches 在 String 类中定义,当且仅当字符串与提供的正则表达式匹配时才返回 true。上面的正则表达式 (^[01]+$) 涵盖了从开头 (^) 到结尾 ($) 是一个或多个 (+) 0 或 1s '[01]' 的序列的所有字符串。

如果你不熟悉正则表达式,网上有很多信息(例如a tutorial

【讨论】:

  • matches("[01]{1,32}")
  • 我不完全明白,对不起,我还是一个新手程序员
  • @PeterLawrey 因为他检查最大长度为 16,所以 32 位限制无关紧要。
  • @midknight 更改了答案以提供更多信息。基本上,您可以将上面的代码片段用于检查值是否为二进制的代码部分。
  • 所以我基本上会在 if 语句中运行它吧?
【解决方案2】:

这一切似乎太复杂了,只需使用 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.");
}

【讨论】:

  • 您可能不想在出错后丢弃行输入。
  • valid已经是假的了,再设置也没有意义。。我只是修改了原问题的代码,没有发明新的要求。。。
  • 你可以重构它,这样你就不需要valid 标志了。顺便说一句,您可以删除行 kbd.nextLine(); 和“按 Enter 继续”此外,如果数字超出范围,您将不会收到错误。
【解决方案3】:
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");
        }        
    }

}

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2021-07-19
    • 2022-10-13
    • 1970-01-01
    • 2022-01-19
    • 2017-07-24
    • 2020-10-16
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多