0

我正在用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;
      }
    }
  }
}

我有这个错误:“这个方法必须返回布尔类型的结果”

4

5 回答 5

5

如果s为空,for则将跳过循环-您的方法根本不会返回任何内容,因此会出现错误。我宁愿先检查这种情况。

但是必须注意,给定的算法是有缺陷的:

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

好的,假设我用给定的 'abc' 字符串调用了这个函数s,但实例包裹在字符串 'acdef' 上。你猜怎么着,你的方法会返回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返回(即,通过条件退出。这反过来意味着字符串的所有字符都与包装字符串开头的字符匹配。fori < sLengths

于 2013-11-12T14:41:02.830 回答
1

假设if(s.mylength() > this.mylength())不满足,那么你的代码就会进入循环。现在假设for循环不循环,意思s是空的。什么会被退回?

确切地!什么都没有,因为循环将被跳过。
要解决此问题,您应该在循环之后进行return一些操作。boolean

于 2013-11-12T14:40:51.050 回答
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
}
于 2013-11-12T14:42:36.400 回答
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 不够“聪明”,无法识别两个 if 一起产生所有可能性。例如

  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,因为它想象了一个两个 if 都为假的场景

如何解决这个问题取决于你的具体程序,但值得注意的是 for 循环在返回之前最多只运行一次,所以是多余的

于 2013-11-12T14:42:38.410 回答
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;
    }
}
于 2013-11-12T14:43:28.500 回答