此方法必须返回boolean类型的结果

时间:2013-11-12 14:39:23

标签: java

我在java中重写类字符串但是对于像startwith这样的方法我有同样的错误。这是我的代码:

public boolean mystartwith(MyString s){
    if(s.mylength() > this.mylength()){
    return false;
    }else{
    for(int i=0 ; i<s.mylength() ; i++){
        if(lesCaracteres[i] != s.lesCaracteres[i]){
            return false;
        }else{
        return true;
      }
    }
  }
}

我有这个错误:“此方法必须返回类型为boolean”

的结果

5 个答案:

答案 0 :(得分:5)

如果s为空,则会跳过for循环 - 并且您的方法根本不会返回任何内容,因此会出错。我宁愿先加检查这个条件。

但必须注意,给定的算法存在缺陷:

for (int i=0; i<s.mylength() ; i++){
  if (lesCaracteres[i] != s.lesCaracteres[i]){
    return false;
  } else {
    return true;
  }
}

好吧,假设我使用'{1}}给出的'abc'字符串调用了这个函数,但是实例包装了字符串'acdef'。猜猜看,你的方法会返回s!问题是您的循环过早中断:在检查第一个字母后立即返回一个值。

实际上,应该这样写:

true

关键区别:int sLength = s.myLength(); if (sLength == 0) { return false; // actually, it's for you to decide: // technically each string begins with an empty string } if (sLength > this.mylength()) { return false; } for (int i = 0; i < sLength; i++) { if (lesCaracteres[i] != s.lesCaracteres[i]){ return false; } } return true; 只返回 如果true循环正常走过(即通过for条件退出。反过来,表示i < sLength字符串的所有字符都与字符串包裹开头的字符匹配。

答案 1 :(得分:1)

假设if(s.mylength() > this.mylength())不满意,那么您的代码将进入循环。 现在假设for循环不循环,意味着s为空。什么将被退回?

完全!什么都没有,因为循环将被跳过。
要解决此问题,您应该在循环后return一些boolean

答案 2 :(得分:1)

if(s.mylength() > this.mylength()){
    return false;
}else{
    for(int i=0 ; i<s.mylength() ; i++){
        if(lesCaracteres[i] != s.lesCaracteres[i]){
            return false;
        }else{
        return true;
      }
    }
    return ____; //place true or false based on your condition
}

答案 3 :(得分:0)

Java必须保证无论输入是什么都会返回一个布尔值,但是有些条件没有返回

public boolean mystartwith(MyString s){
    if(s.mylength() > this.mylength()){
        return false;
    }else{
        for(int i=0 ; i<s.mylength() ; i++){
            if(lesCaracteres[i] != s.lesCaracteres[i]){
                return false;
            }else{
                return true;
            }
        }
        //what if s.mylength()==0 and the loop never runs?!
        //therefore the code will get to here, and the method will end without a return
    }
}

请注意,java并不“足够聪明”来识别两个ifs共同构成所有可能性。例如

  boolean method(int a){
    if (a>0){
        return true;
    }else{

       if (a<=0){
          return false;
       }
       //program can never get here, BUT java doesn't realise that
  }

仍然不满足java,因为它想象两个ifs都是假的情况

如何解决这个问题取决于你的特定程序,但值得注意的是for循环在返回之前最多只运行一次,因此是superfluos

答案 4 :(得分:0)

您可以像这样重新定义代码:

public boolean mystartwith(MyString s){
    if(s.mylength() > this.mylength()){
       return false;
    }else{
       for(int i=0 ; i<s.mylength() ; i++){
          if(lesCaracteres[i] != s.lesCaracteres[i]){
             return false;
          }else{
             return true;
          }
       }
       return false;
    }
}