2013-07-12 116 views
0

我写了这个小程序作为Java练习(它模拟7个电逻辑门),因为我目前正在学习它。但是当我尝试编译它时,它给了我几个错误,说明了"MISSING RETURN STATEMENT",但仅限于具有2个if语句(AND,OR,NAND和NOR)的子例程。我想知道是否有什么我不知道Java的if语句。我也想知道是否有在Java中的方式做if(X && Y),像C.无论如何,这里是代码:缺失返回资料

package logic; 
public class logic { 
    boolean AND(boolean A, boolean B) { 
     if(A==true) { 
      if(B==true) 
       return true; 
     } 
     else 
      return false; 
    } 
    boolean OR(boolean A, boolean B) { 
     if(A==false) { 
      if(B==false) 
       return false; 
     } 
     else 
      return true; 
    } 
    boolean NOT(boolean A) { 
     if(A==true) 
      return false; 
     else 
      return true; 
    } 
    boolean NAND(boolean A, boolean B) { 
     if(A==true) { 
      if(B==true) 
       return false; 
     } 
     else 
      return true; 
    } 
    boolean NOR(boolean A, boolean B) { 
     if(A==false) { 
      if(B==false) 
       return true; 
     } 
     else 
      return false; 
    } 
    boolean XOR(boolean A, boolean B) { 
     if(A==B) 
      return false; 
     else 
      return true; 
    } 
    boolean XNOR(boolean A, boolean B) { 
     if(A==B) 
      return true; 
     else 
      return false; 
    } 
} 

和错误消息:

logic/logic.java:10: error: missing return statement 
    } 
    ^
logic/logic.java:18: error: missing return statement 
    } 
    ^
logic/logic.java:32: error: missing return statement 
    } 
    ^
logic/logic.java:40: error: missing return statement 
    } 
    ^
4 errors 

所有帮助或建议,是公认。

由于某种原因,当我试图使用if(A==true && B==true)之前它没有工作,但现在它是。

+1

对于'AND','返回A && B',对于'OR','return A || B'等,或者完全省略这些功能? – Dukeling

+2

'A == true'是多余的,可以简化为'A'。 – Dukeling

+1

@Dukeling这是一个味道的问题,然而 –

回答

0

缺少返回语句错误意味着函数声明说它返回一些东西,但是至少有一个流不返回任何东西。例如。在代码中 - 如果A是真的,B是假的。修改了代码:

package logic; 
public class Logic { 
boolean AND(boolean A, boolean B) { 
    if (A == true && B == true) { 
     return true; 
    } 
    return false; 
} 

boolean OR(boolean A, boolean B) { 
    if (A == false && B == false) { 
     return false; 
    } 
    return true; 
} 

boolean NOT(boolean A) { 
    if (A == true) { 
     return false; 
    } 
    return true; 
} 

boolean NAND(boolean A, boolean B) { 
    if (A == true && B == true) { 
     return false; 
    } 
    return true; 
} 

boolean NOR(boolean A, boolean B) { 
    if (A == false && B == false) { 
     return true; 
    } 
    return false; 
} 

boolean XOR(boolean A, boolean B) { 
    if (A == B) { 
     return false; 
    } 
    return true; 
} 

boolean XNOR(boolean A, boolean B) { 
    if (A == B) { 
     return true; 
    } 
    return false; 
} 

}

1

某些方法的路径导致没有返回值。

例如:

boolean NOR(boolean A, boolean B) { 
      if(A==false) { 
       if(B==false) 
        return true; 
      } 
      else 
       return false; 
     } 

如果A ==虚假和B ==真,没有return语句运行。这就是你得到编译器错误的原因。

这是通过把周围所有的if语句的括号也许变得更加明显:

boolean NOR(boolean A, boolean B) { 
      if(A==false) 
      { 
       if(B==false) 
       { 
        return true; 
       } 
       //No return here 
      } 
      else 
      { 
       return false; 
      } 

      //No return here 
     } 
+0

你的第二个“这里没有回报”是错误的。没有回报是好的,因为没有分支可以到达那里。 – Dukeling

+0

@Dukeling你是什么意思?那里没有返回语句,所以有分支没有返回语句。如果A == false,并且B == true,它将会到达那里。 – thatidiotguy

+0

@thatidiotguy这里有一个隐含的空白,如果内部if语句是假的,它将不返回任何内容 –

3

的Java不像Python的编译器在哪里明白代码块是通过简单的缩进表示。我会推荐总是使用大括号{ }打开关闭一个新的代码块即使是一个班轮。只需重写你的一个门:

boolean AND(boolean A, boolean B) { 
    if(A==true) { 
     if(B==true) { 
      return true; 
     } 
     //missing return here! 
     //fix it by adding a return 
     return false; 
    } else { 
     return false; 
    } 
} 
+3

+1对于该建议,它可以节省程序员的生命! – NINCOMPOOP

+0

@TheNewIdiot是的,这在执行Java编程时被强烈推荐。 –

+0

@downvoter照顾至少解释你的downvote? –

1

你缺少某些代码路径的返回语句。

OR,如果A为真且B为假会发生什么?

0

有返回,可能会导致没有价值的可能值,记住一个if有一个空else{}不管你给它一个或没有,所以让我们来看看你的功能之一

boolean AND(boolean A, boolean B) { 
    if(A==true) { 
     if(B==true) 
      return true; 
     }else{ 
       //else made explicit by me 
       //NO RETURN 
     } 
    } 
    else{ 
     return false; 
    } 
} 

因此,如果是真的,但B是虚假的没有任何将被返回,编译器不能允许这个

它也是不明智的使用多线 - 无支撑 - 如果因为它使它更容易做出这些类型的错误。请参阅http://cafe.elharo.com/blogroll/braceless-if-considered-harmful/

0

您必须对所有可能的“路径”具有return语句。例如

boolean AND(boolean A, boolean B) { 
     if(A==true) { 
      if(B==true) 
       return true; 
     } 
     else 
      return false; 
    } 

相当于

boolean AND(boolean A, boolean B) { 
     if(A==true) { 
      if(B==true) 
       return true; 
      else 
       //something must be returned here 
     } 
     else 
      return false; 
    } 

你也可以有一个返回NULL;在每个方法结束时声明以避免此错误。

+0

它值得补充的是,使用多线 - 无杠杆 - 如果被认为是不好的做法 –

1

除了返回语句错误之外,您正在使代码过于复杂。 Java已经具有复合逻辑运算符,可以极大地简化对程序的推理。对于OR

// no need for A == true, A is either already true or false 
// just combine them using the && operator 
boolean AND(boolean A, boolean B) { 
    return A && B; 
} 

同理:

boolean OR(boolean A, boolean B) { 
    return A || B; 
} 

您也可以建立其他的逻辑门逻辑门,EX NOT + OR == NOR

boolean NOT(boolean A) { 
    return !A; 
} 

boolean OR(boolean A, boolean B) { 
    return A || B; 
} 

将二者结合起来,以创建NOR:

boolean NOR(boolean A, boolean B) { 
    return NOT(OR(A, B)); 
} 

使用此功能,看看你是否可以自己组成休息。

+0

不再需要功能了... – arshajii

+0

@arshajii首先不需要函数,但* *因为它们正在使用这很简单。 –

+0

酷!首先,我对逻辑门不太了解:P。 “A ||”究竟是什么? B'呢? –

2

正如其他人所指出的那样,你真的错过了一些return语句。这里是你正在寻找的短版本:

public class Logic { 
    boolean AND(boolean A, boolean B) { 
     return A && B; 
    } 
    boolean OR(boolean A, boolean B) { 
     return A || B; 
    } 
    boolean NOT(boolean A) { 
     return !A; 
    } 
    boolean NAND(boolean A, boolean B) { 
     return !(A && B); 
    } 
    boolean NOR(boolean A, boolean B) { 
     return !(A || B); 
    } 
    boolean XOR(boolean A, boolean B) { 
     return A^B; 
    } 
    boolean XNOR(boolean A, boolean B) { 
     return !(A^B); 
    } 
} 

请注意,Java中的类名应该以大写字母开头。

+0

为什么不编写这些?你已经写了NOT,OR,XOR和AND。你可以从那里构建XNOR,NOR和NAND。从技术上讲,你可以从NAND门建立一切。 –

+0

当然,你也可以将XOR组合为OR(AND(A,NOT(B))和AND(B,NOT(A)))。我想我出于效率原因选择这个答案(尽量减少昂贵的函数调用)。 – winne2