Java BlueJ中的编译错误-if else with return语句

Java BlueJ中的编译错误-if else with return语句,java,bluej,Java,Bluej,我正在使用BlueJ IDE编写java程序 我有一个字符串返回类型的方法。我将return语句放在if-else中,这样,如果布尔变量标志的值为true,则返回一个值,而如果值为false,则返回另一个值 现在的问题是,即使在这之后,BlueJ也会请求另一个return语句,如下所示 如果我在If-else之后再给你一次回报,它就会起作用 为什么会这样?我了解到,在返回声明之后不能有任何声明。那么,为什么编译器要求另一个返回语句呢 如果有人想要代码用于剪切粘贴,请点击这里。此代码用于将二进制数

我正在使用BlueJ IDE编写java程序

我有一个字符串返回类型的方法。我将return语句放在if-else中,这样,如果布尔变量标志的值为true,则返回一个值,而如果值为false,则返回另一个值

现在的问题是,即使在这之后,BlueJ也会请求另一个return语句,如下所示

如果我在If-else之后再给你一次回报,它就会起作用

为什么会这样?我了解到,在返回声明之后不能有任何声明。那么,为什么编译器要求另一个返回语句呢

如果有人想要代码用于剪切粘贴,请点击这里。此代码用于将二进制数转换为十进制等价数,包括分数,但不包括负数

public class Conversions{
    protected String Binary_Decimal(String str){
        int a = str.indexOf('.');
        boolean flag = false;
        if (a == -1){
            str += ".0";
            a = str.indexOf('.');
            flag = true;
        }
        String bd = str.substring(0, a);
        String ad = str.substring(a + 1);
        a = 0;
        double num = 0;
        for (int i = bd.length() - 1; i >= 0; i--){
             num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i)));
            a++;
        }
        if (flag == true){
            return Integer.toString((int) num);
        }
        else if (flag == true) {
            a = -1;
            for (int i = 0; i < ad.length(); i++){
                num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i)));
                a--;
            }
            return String.valueOf(num);
        }
        return String.valueOf(num); //<-- WHY DOESN'T IT RUN WITHOUT THIS EXTRA return?
    }
}
这里,str是用户使用不同的输入方法输入的字符串

那么,为什么编译器要求另一个返回语句呢

因为您缺少默认的返回语句

如果您没有满足任何条件怎么办?一定有什么东西返回默认值,对吗?这就是问题所在。这就是为什么在您取消注释该行时会编译它

甚至,如果您有一个else语句,您的程序将至少有一个满意的返回,并且它也会被编译。试试看

我了解到,在返回声明之后不能有任何声明

这个声明附带了一些条件。在if条件中有return语句。因此,如果表达式不为true,则无法执行返回

那么,为什么编译器要求另一个返回语句呢

因为您缺少默认的返回语句

如果您没有满足任何条件怎么办?一定有什么东西返回默认值,对吗?这就是问题所在。这就是为什么在您取消注释该行时会编译它

甚至,如果您有一个else语句,您的程序将至少有一个满意的返回,并且它也会被编译。试试看

我了解到,在返回声明之后不能有任何声明


这个声明附带了一些条件。在if条件中有return语句。因此,如果表达式不正确,返回方法就无法执行。

< P>删除第二个if if子句,并直接在第一个返回语句之后放置块,并认为该标志是一个布尔值。详情如下:

if (flag) return Integer.toString((int) num);
a=-1;
for(....){
....
}
return String.valueOf(num);

这样,编译器就不应该通知你这个错误。

< P>删除第二个if if子句,直接在第一个返回语句之后放置块,并认为这个标志是一个布尔值。详情如下:

if (flag) return Integer.toString((int) num);
a=-1;
for(....){
....
}
return String.valueOf(num);

这样,编译器就不应该通知您该错误。

问题是您将if-else作为if-else if编写。编译器不理解或不关心您的两个条件是互斥的,因此涵盖所有情况。考虑到编写分支的方式,需要显式的else或catchall返回,编译器才能确保函数始终返回字符串


这是一个例子,说明了当您有一组条件时,显式地说明else是一个坏主意。更重要的原因是if通常包含更复杂的内容,您可能无法正确地否定它。

问题在于您将if-else作为if-else if编写。编译器不理解或不关心您的两个条件是互斥的,因此涵盖所有情况。考虑到编写分支的方式,需要显式的else或catchall返回,编译器才能确保函数始终返回字符串


这是一个例子,说明了当您有一组条件时,显式地说明else是一个坏主意。更重要的原因是if通常包含更复杂的内容,您可能无法正确地否定它。

将代码作为文本插入。图像不能被引用、编译为文本的etcinsert代码。图像不能被引用,编译EcCt认为编译器不知道你的If the Sel-For是否包含所有可能的条件,并要求另一个包含所有其他情况的其他。此外,考虑到如果第一个返回关闭了你的调用,那么空代码中的其余代码就不会被执行,所以没有任何意义。特别是如果您正在测试布尔型的标志。再测试标志是没有意义的,因为如果标志不是真的,它必须是假的。考虑编译器不知道你的IF,否则会包含所有可能的条件,并请求另一个包含所有其他情况的其他。此外,考虑到如果第一个返回关闭了你的调用,该空白中的其余代码将不会执行,因此ELSE没有意义。特别是如果您正在测试布尔型的标志。再次测试标志是没有意义的,因为如果标志不是真的
,这一定是假的。用这个解决了。谢谢,我已经准备好了。谢谢