2016-07-29 52 views
0

當前位於我書中關於循環和循環的章節中。我有時會遇到一個問題,該方法需要我返回一些東西。例如,考慮下面我的代碼 。基本上,練習是按升序排列所有因素。現在繼承問題無法理解返回類型的位置(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

回答

2

事情是,我真的不想在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。我添加了我的工作代碼,出於某種原因,它看起來結構很差,你能添加你的想法嗎? –

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中研究過數組。 –

1

Java不會讓你這樣做,因爲如果if (num % i == 0)永遠不會是真的會發生什麼?

返回類型的方法是int,所以它必須返回int。 if語句可能是錯誤的,並不是每個條件都包含return語句。

所以,如果你想要你可以返回類似-1或其他無效值。然後你知道這個函數沒有找到它要找的東西。

+0

好吧,我正在想辦法對這個問題進行分類。感謝您的幫助 –