Java 如何正确地检查输入是否只是二进制数?

Java 如何正确地检查输入是否只是二进制数?,java,binary,runtime-error,Java,Binary,Runtime Error,有人能告诉我为什么这段代码总是告诉我数字格式异常,而当我试图从二进制数转换为十进制数时却不打印错误消息吗` public static void readAndConvertBinaryValue() { Scanner kbd = new Scanner(System.in); boolean valid = false; do { System.out.print("\nEnter a binary value containing up to

有人能告诉我为什么这段代码总是告诉我数字格式异常,而当我试图从二进制数转换为十进制数时却不打印错误消息吗`

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);
}
publicstaticvoid readAndConvertBinaryValue()
{
扫描仪kbd=新扫描仪(System.in);
布尔有效=假;
做
{
System.out.print(“\n输入一个最多包含16的二进制值”
+“数字:”;
bAction=kbd.nextLine();
int result=bAction.compareTo(二进制数);
如果(结果>1 | |结果<-9 | |动作长度()>16)
{
System.out.print(“错误:无效的二进制值。”
+“\n请重试。\n按Enter继续…”);
kbd.nextLine();
}否则
{
字符值;
int charlim=0;
值=字符(charlim);
如果(值='1'| |值=='0')
{
二进制=整数.parseInt(bAction,2);
有效=真;
}否则
{
System.out.print(“错误:无效的二进制值。”
+“\n请重试。\n按Enter继续…”);
kbd.nextLine();
}
}
}而(!有效);
}

使用正则表达式:

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


如果您不熟悉正则表达式,web上有大量信息(例如使用正则表达式):

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


如果您不熟悉正则表达式,那么web上有大量信息(例如)

这一切似乎太复杂了,只需使用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.");
}
Scanner kbd=新扫描仪(System.in);
System.out.print(“\n输入一个最多包含16”+”位的二进制值:”;
字符串bAction=kbd.nextLine();
试一试{
int binary=Integer.parseInt(bAction,2);

如果(binary>=(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.");
}
Scanner kbd=新扫描仪(System.in);
System.out.print(“\n输入一个最多包含16”+”位的二进制值:”;
字符串bAction=kbd.nextLine();
试一试{
int binary=Integer.parseInt(bAction,2);


如果(二进制>=(1)我建议您检查所有数字,而不仅仅是第一个数字。我还建议您检查数字是否小于33,否则这也会给您一个NumberFormatException。一个简单的方法是不检查,而是在出现NumebrFormatException时捕获它。我只是在出现错误后添加了代码,您将放弃下一行读取。我建议您p通过调试器中的代码更好地了解代码的作用?如何检查所有数字@PeterLawrey@midknight您可以使用正则表达式,也可以使用循环。我建议您编写一个包含检查的方法。我建议您检查所有数字,而不仅仅是第一个。我还建议您检查少于33的数字或者这也会给你一个NumberFormatException。一个简单的方法不是检查,而是在发生NumebrFormatException时捕获它。我只是在你出错后添加了代码,你放弃了下一行读取。我建议你在调试器中逐步检查你的代码,以更好地了解你的代码在做什么?我该如何检查把所有的数字都去掉@PeterLawrey@midknight您可以使用正则表达式,也可以使用循环。我建议编写一个方法来包含检查。或者
匹配(“[01]{1,32}”)
我不完全理解,抱歉,我还是个新手programmer@PeterLawrey因为他检查的最大长度是16位,所以32位的限制是不相关的。@midknight更改了答案以提供更多信息。基本上,您可以在代码的某一部分使用上面的snipplet来检查值是否是二进制的。所以我想sicaly在if语句中运行它,或者
匹配(“[01]{1,32}”)
我不完全理解,抱歉,我还是个新手programmer@PeterLawrey因为他检查的最大长度是16位,所以32位的限制是不相关的。@midknight更改了答案以提供更多信息。基本上,您可以在代码的某一部分使用上面的snipplet来检查值是否是二进制的。所以我想通常在if语句中运行,嗯?您可能不想在出现错误后丢弃行输入。在@PeterLawrey注释之后,可能catch应该设置为valid为false,并且错误消息会根据valid中的值显示在try catch之外。valid已经为false,再次设置它没有什么意义。我只修改了code在最初的问题中,不是发明了新的需求…您可以重构它,这样您就不需要
有效的
标志。顺便说一句,您可以删除行
kbd.nextLine();
和“按Enter键继续”此外,如果数字超出范围,则不会出现错误。您可能不希望在出现错误后放弃行输入。在@PeterLawrey注释之后,可能catch应该设置为valid为false,并且错误消息会根据valid中的值显示在try catch之外。valid已经为false,再次设置它没有什么意义。我已经只修改了原始问题中的代码,没有发明新的需求…您可以重构它,这样就不需要
有效的
标志。顺便说一句,您可以