我使用BlueJ IDE编写java程序。
我有一个String返回类型的方法。我把return语句放在if-else中,这样如果布尔变量" flag"具有真值,然后返回一个值,而如果值为false,则返回另一个值。
现在,问题是BlueJ在此之后要求另一个return语句,如下所示。
如果我在if-else之后给予另一次回报,那就有效。
为什么会这样?我知道在return语句之后没有语句。那么,为什么编译器要求另一个return语句?
如果有人想要用于剪切粘贴目的的代码,那么就是这样。此代码用于将二进制数转换为十进制数,包括分数,但不包含负数。
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
是用户使用其他方法Input()
输入的字符串。
答案 0 :(得分:2)
那么,为什么编译器要求另一个return语句?
因为您缺少默认的return语句。
如果您满意的条件都没有?必须有一些返回默认权利吗?这就是问题所在。这就是为什么在取消注释该行时编译的原因。
或者甚至,你有一个else语句,你的程序将至少有一个满意的返回,它也会被编译。试试吧。
我了解到在返回声明后没有任何陈述。
此声明附带一些条件。你在if条件中有return语句。因此,如果表达式不正确,则无法执行返回。
答案 1 :(得分:2)
删除第二个ELSE IF子句并将块直接放在第一个return语句之后,并认为该标志是一个布尔值。如下:
if (flag) return Integer.toString((int) num);
a=-1;
for(....){
....
}
return String.valueOf(num);
通过这种方式,编译器不应该通知您该错误。
答案 2 :(得分:2)
问题是您将if - else
写为if - else if
。编译器不理解或不关心您拥有的两个条件是互斥的,因此涵盖所有情况。鉴于你如何编写分支,你需要一个明确的else
或catchall return
,以确保编译器始终返回String
。
这是为什么当你有一套条件时明确地拼出else
是个坏主意的一个例子。更重要的原因是,if
通常会包含更复杂的内容,而且您可能无法正确否定它。