繁体   English   中英

无法理解返回类型的位置(Big Java Ex 6.8)

[英]Having trouble understanding return type placement( Big Java Ex 6.8)

当前,在我的书的这一章中,我们讨论for循环和循环。 有时我遇到一个问题,该方法需要我返回一些东西。 例如,考虑下面的代码。 基本上,练习是将所有因素按升序排列。 现在这是问题

如您所见,我需要在for循环之外使用return语句。 现在,我想我的书没有完全正确地解释这一点,或者我不理解Java中正确返回的概念,但是如果您愿意,我们的return语句是否总是必须在最外面的缩进中?

问题是,我真的不想在for循环之外返回任何东西。 我只想在那种情况下还i 为什么Java不让我这样做? 有什么好的反作用?

自从我开始学习循环和for循环以来,我一直很难理解这一点。 我想我可以只使用system.out.println(i)而不返回它? 但后来我应该怎么return 我还可以将其设置为void类型,然后再创建另一种方法来打印它,我猜吗?

class factors{

    private int num;

    public factors(int num)
    {
        this.num = num;
    }

    public int getFactors()
    {
        for(int i = 1 ; i<num ; i++)
        {
            if (num % i == 0)
            {
                return i;
            }
        }
         // I NEED TO PUT A RETURN STATEMENT HERE

    }   
}

public class test{
    public static void main(String [] args)
    {
        factors fact = new factors(20);
        System.out.println(fact.getFactors());
    }
}

现在就可以工作(我不太喜欢我的解决方案)

class factors{

    private int num;

    public factors(int num)
    {
        this.num = num;
    }

    public void getFactors()
    {
        for(int i = 1 ; i<num ; i++)
        {
            if (num % i == 0)
            {
                System.out.println(i);
            }

        }   
    }





}

public class test{
    public static void main(String [] args)
    {
        factors fact = new factors(20);
        fact.getFactors();
    }
}

问题是,我真的不想在for循环之外返回任何东西。 我只想在那种情况下还我。 为什么Java不让我这样做?

Java使您可以做到这一点。 达到条件后,在循环内部返回是没有问题的。

Java允许您有多个return语句,因此添加另一个return 0; 允许循环之后。

Java到达第一个 return语句后即返回,并且其他return语句执行(该方法不再执行)(除了一些罕见的带有try-catch和return的极端情况,但这完全是另一回事)。

但是为什么要这样做呢?

Java要求,对于所有可能的路径 ,必须存在具有正确类型的return 即使您自己可以数学证明Java抱怨的路径都不会被采用,编译器也可能无法在运行时证明该路径是不可能 因此,您只需要在其中添加带有虚拟值的返回值即可。

在您的具体示例中 ,存在循环永远不会执行的情况。 如果num <= 0 ,则永远不会满足循环条件,并且跳过整个循环主体。 如果没有返回值,则该方法无效,因为您无法从具有返回类型int的方法中返回任何内容。

因此,在您的示例中,编译器实际上比您聪明,并且可以防止您犯错误-因为它找到了您认为不会发生的路径。

new factors(-1).getFactors(); // you don't check the passed value at all ;)

从您的评论看来,您想返回所有因素。 在Java中,从函数返回一次,并且仅返回一次。 这意味着您必须汇总结果并返回一个List或值array

public List<Integer> getFactors(int num) {
    List<Integer> factors = new ArrayList<>();
    for (int i = 1 ; i<num ; i++)
    {
        if (num % i == 0)
        {
            factors.add(i);
        }
    }
    return factors;
}

public static void main(String[] args) {
    System.out.println(Arrays.toString(new factors(20).getFactors());
    // prints a comma-separated list of all factors
}

如果您愿意,我们的return语句是否总是必须位于最外面的缩进位置?

没有。

但是所有潜在的代码路径都必须返回某些内容。 考虑以下结构:

for(int i = 1 ; i<num ; i++)
{
    if (num % i == 0)
    {
        return i;
    }
}

如果num是一个永不输入循环本身的值,会发生什么情况? 或者, if从不满足if条件,会发生什么? 不会遇到任何return语句,这是无效的。

编译器必须保证该方法将在任何和所有潜在的运行时条件下返回某些内容 因此,虽然从循环内返回是完全有效的,但如果从未到达该return语句,则还必须提供返回逻辑。

Java不允许您这样做,因为如果if (num % i == 0)永远不为真会发生什么?

方法的返回类型为int ,因此它必须返回一个int 而且if语句可能为假,并非每个条件都由return语句覆盖。

因此,如果您愿意,可以返回-1或其他无效值。 然后,您知道该函数没有找到它想要的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM