2011-07-20 49 views
0

今天一直工作數小時,所以我可能會錯過一些愚蠢的東西,但是,在這一點上,我有點盲目與此並尋找解釋這種行爲2在相同的功能返回射擊?

我做了一個問題的例子我有和我找到的解決方案不是一個解決方案。

問題:對於以下函數,我傳遞1作爲shotCount和9作爲倒計時 結果當我調試時,我看到第一個如果運行,然後運行返回2,但隨後其他人也決定運行並且最後返回-1

public int getNextShot(int shotCount, int Countdown) 
    { 
     if ((shotCount == 1) && (Countdown != 10)) return 2; 
     else if (shotCount == 0) return 1; 
     else return -1; 
    } 

但如果我這樣做(相同的參數),它的工作原理:

public int getNextShot(int shotCount, int Countdown) 
    { 
     int res = -2; 
     if ((shotCount == 1) && (Countdown != 10)) res = 2; 
     else if (shotCount == 0) res = 1; 
     else res = -1; 
     return res; 
    } 

我失去了一些東西在這裏?

謝謝:)

+5

你爲什麼不使用大括號? –

+0

發佈調用此方法的代碼,以及爲什麼你認爲你有「2返回觸發」(這在Java中是不可能的,至少如上所述)。 – jkraybill

+2

你確定你在正確的位置設置斷點嗎?也許你不小心跳過了你的一個return語句,同時在調試器中繼續執行代碼,並且實際上獲得了第二次函數調用?嘗試將收益分解到他們自己的行,並在所有行上設置斷點。 (和Oleg說的一樣 - 使用花括號!這是*總是包含它們的原因之一) –

回答

4

我想你是錯的。

有時Eclipse中的調試器會像跳到方法調用的最後一行一樣行爲,但返回正確的值。

例如,我只是複製並粘貼您的代碼,它對我來說運行良好。下面的代碼打印2.

public class AA { 

     public static void main(String[] args) { 

       System.out.println(getNextShot(1, 9)); 

     } 

     public static int getNextShot(int shotCount, int Countdown) 
    { 
     if ((shotCount == 1) && (Countdown != 10)) return 2; 
     else if (shotCount == 0) return 1; 
     else return -1; 
    } 
} 
+1

這通常是因爲編譯器做了一些優化而發生的(不知道eclipse-java,但它對於android來說很常見)。 – Voo

+0

我認爲你是對的,但在給你作爲最佳答案之前,我想再運行一次測試。現在已經很晚了,我明天將會運行它。並讓你知道,因爲我看到你在說什麼,但我認爲有時候它實際上需要第二個返回值。 –

+0

另外我想添加如果我使用的第二種情況下的代碼,這種奇怪的行爲不顯示,只有在使用多個返回時纔看到它。 –

0

此代碼是確定的。當我運行此:

public static int getNextShot1(int shotCount, int Countdown) { 
    if ((shotCount == 1) && (Countdown != 10)) { 
     return 2; 
    } else if (shotCount == 0) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 
public static int getNextShot2(int shotCount, int Countdown) { 
    int res = -2; 
    if ((shotCount == 1) && !(Countdown == 10)) { 
     res = 2; 
    } else if (shotCount == 0) { 
     res = 1; 
    } else { 
     res = -1; 
    } 
    return res; 
} 
public static void main(String[] args) throws KeyStoreException, ParseException { 
    System.out.println(getNextShot1(1, 9)); 
    System.out.println(getNextShot2(1, 9)); 

} 

我得到

2 
2 
在控制檯上

:) 二級功能看起來是這樣的(final關鍵字):

public static int getNextShot2(int shotCount, int Countdown) { 
    final int res; 
    if ((shotCount == 1) && !(Countdown == 10)) { 
     res = 2; 
    } else if (shotCount == 0) { 
     res = 1; 
    } else { 
     res = -1; 
    } 
    return res; 
}