我在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”
的结果答案 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;
}
}