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

问题描述:

当前位于我书中关于循环和循环的章节中。我有时会遇到一个问题,该方法需要我返回一些东西。例如,考虑下面我的代码 。基本上,练习是按升序排列所有因素。现在继承问题无法理解返回类型的位置(Big Java Ex 6.8)

正如你所看到的,我需要在for循环之外的return语句。现在我想我的书没有正确地解释这个,或者我不明白在java中正确返回概念 ,但是如果你愿意,我们的return语句总是必须在最外面的缩进吗?

事情是,我真的不想在for循环之外返回任何东西。我只想在这种情况下返回i。为什么java不让我这样做? 什么是好的反击?

自从我开始学习循环和循环以来,我一直无法理解这一点。我想我可以只是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(); 
    } 
} 
+2

您是否知道,返回一些函数必须恰好一次回归,而且功能*停止去*,当它返回?该循环不会返回所有因素,并且如果它根本找不到任何因素(可能是'num == 1'),则根本不会返回“return”语句。 – user2357112

+0

为什么downvote? – Austin

事情是,我真的不想在for循环之外返回任何东西。我只想在这种情况下回到我身边。为什么java不让我这样做?

Java可以让你做到这一点。达到该条件后在回路内返回没有任何问题。

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

的Java返回一旦它击中第一 return语句,以及其他return语句是执行(不再被执行的方法)(除了某些罕见的情况下,边用的try-catch和回报,但多数民众赞成另一个故事完全)。

但是它为什么需要?

Java要求对于所有可能的路径存在具有正确类型的return。即使您自己可以从数学上证明Java从未采取过路径,但编译器可能无法证明路径在运行时上不可能被所证实。所以你只需要在那里添加一个虚拟值。

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

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

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

从您的意见,似乎要返回的因素。在java中,你只能从函数返回一次,并且只返回一次。这意味着你必须汇总结果和返回值的Listarray

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 
} 
+0

这是一个很好的解释+1。我添加了我的工作代码,出于某种原因,它看起来结构很差,你能添加你的想法吗? –

做退货语句总是有如果你将要在最外面的缩进?

然而所有潜在代码路径必须回报。考虑这样的结构:

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

如果num为环路本身从未进入过的值会发生什么?或者如果if条件从未满足会发生什么情况?将不会遇到任何return声明,这是无效的。

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

+0

但我不想在我的其他语句中返回任何内容,那么反措施是什么?如果它是一个字符串,通常我只是回到“”,只是为了程序运行?我正在考虑做出这个空白。但后来我不知道如何在另一种打印机方法中获得我的所有值。 –

+0

@cresjoy:该方法返回一个“int”,所以所有的代码路径必须在某处返回一个int。如果方法是'void',那么没有代码路径可以返回一个值。从逻辑上讲,确定方法*做什么*和返回值*意味着什么是真的。但是如果你声明方法返回一个'int',那么,你必须返回一个'int'。我甚至不清楚这种方法应该做什么。 – David

+0

对。所以我的意思是我会做一个无效的方法,它将实际上具有我的所有值,然后再实际返回这些值的另一种方法。然而,我想知道如果这可能,因为我还没有在java中研究过数组。 –

Java不会让你这样做,因为如果if (num % i == 0)永远不会是真的会发生什么?

返回类型的方法是int,所以它必须返回int。 if语句可能是错误的,并不是每个条件都包含return语句。

所以,如果你想要你可以返回类似-1或其他无效值。然后你知道这个函数没有找到它要找的东西。

+0

好吧,我正在想办法对这个问题进行分类。感谢您的帮助 –