在Java中从for循环内部返回的正确方法是什么?

时间:2014-02-27 08:22:04

标签: java for-loop

所以我有这个小方法,它接受一个整数参数并检查数组(设置为属性)是否包含某个对象。如果是,则返回该对象,否则返回null。这里的问题是当我尝试返回某些内容时出现错误。这是:

myClass.java:33: error: missing return statement
        }
        ^
1 error

我有一个return语句,它包含三元运算符,这意味着它不惜任何代价返回一些东西。这是我的方法:

public Banesa gjejBanese(int nrBaneses) {

    for (int i = 0; i < listaBanesave.length; i++) {
        return (listaBanesave[i].getNrBanesa() == nrBaneses) ? listaBanesave[i] : null;
    }
}

它出了什么问题?为什么我会收到这个错误?

7 个答案:

答案 0 :(得分:3)

  

采用整数参数并检查数组(设置为属性)是否包含某个对象。如果是,则返回该对象,否则返回null。

根据您的要求,您的代码应该是(例如):

public Banesa gjejBanese(int nrBaneses) {
    Banesa ret;
    for (int i = 0; i < listaBanesave.length; i++) {
        ret = listaBansesave[i];
        if (ret.getNrBanesa() == nrBaneses)
            return ret;
    }

    // No element found or list is empty
    return null;
}

使用您当前的代码:

  • 如果列表为空,则不输入“for”循环,因此没有return语句 - 因此编译错误;
  • 在任何情况下你只检查第一个元素,你从不检查其他元素,因为你在每次迭代中return(其中只有一个)

答案 1 :(得分:1)

你应该在循环之外有一个return。因为当listaBanesave为空时,不会有return语句 - 这会使编译器生气。

return是您的决定。取决于您的逻辑。

答案 2 :(得分:1)

你的逻辑也是错误的。您只检查数组中的第一项是否= =您传递给函数的int。在检查第一项之后肯定有一个返回并不重要哪种情况是真的(如果或其他)并且函数结束。它是一样的:

public Banesa gjejBanese(int nrBaneses) {

    return (listaBanesave[0].getNrBanesa() == nrBaneses) ? listaBanesave[i] : null;

}

它应该是:

public Banesa gjejBanese(int nrBaneses) {

    for (int i = 0; i < listaBanesave.length; i++) 
    {
        if(istaBanesave[i].getNrBanesa() == nrBaneses)     
            return listaBanesave[i];
    }
    return null;
}

答案 3 :(得分:0)

您应该返回null作为方法的最后一行,即使根据您的规范(“如果是,则返回该对象,否则返回null 。”)。

public Banesa gjejBanese(int nrBaneses) {

    for (int i = 0; i < listaBanesave.length; i++) {
        return (listaBanesave[i].getNrBanesa() == nrBaneses) ? listaBanesave[i] : null;
    }

    return null;
}

答案 4 :(得分:0)

循环中的条件有可能不满足且不会发生返回。

所以你需要有一个默认的回报。

public Banesa gjejBanese(int nrBaneses) {

    for (int i = 0; i < listaBanesave.length; i++) {
        return (listaBanesave[i].getNrBanesa() == nrBaneses) ? listaBanesave[i] : null;
    }
   return null; //when there is no chance to enter in loop.
}

答案 5 :(得分:0)

我认为您需要在listaBanesave中循环所有项目并检查每个是否符合条件,如果没有,<{1 }}。目前,如果第一个项目不符合条件,您的代码将返回return null - 即可将其重写为:

null

据推测,这不是你想要的。

public Banesa gjejBanese(int nrBaneses) {
    if(listaBanesave.length == 0)
        return null;
    return (listaBanesave[0].getNrBanesa() == nrBaneses) ? listaBanesave[0] : null;
}

所以检查循环中的每个项目;如果匹配,返回它。否则,一旦循环结束,您就知道您没有匹配 - public Banesa gjejBanese(int nrBaneses) { for (int i = 0; i < listaBanesave.length; i++) { if (listaBanesave[i].getNrBanesa() == nrBaneses) { return listaBanesave[i]; } } return null; }

答案 6 :(得分:0)

根据我的评论,我更喜欢这样写:

public Banesa gjejBanese(int nrBaneses) {
    Banesa found = null;
    for (int i = 0; i < listaBanesave.length; i++) {
        if (listaBanesave[i].getNrBanesa() == nrBaneses) {   // should this be == or equals()?
            found = listaBanesave[i];
            break;
        }
    }
    return found;
}

我认为它更清楚,有一个退出点(而不是for循环)。我会说?:运算符非常有用,但它在您的方案中无法提供可读性。

另外,我已经发表评论,检查“==”是否足够测试或者#equals是否应该是用户?

相关问题