2015-11-17 84 views
0

我有一個關於我張貼波紋管的函數的問題。 它做它應該做的事,甚至打印出正確的值。 但是由於某些原因,它也會引發異常。有誰知道爲什麼嗎?Java的添加列表int

該函數應該添加列表中的所有int值。

public int addRecursive(List<Integer> l){ 
    if(l.size()!=1){ 
     l.add(l.get(0)+l.get(1)); 
     l.remove(1); 
     l.remove(0); 
     addRecursive(l); 
    } 
return l.get(0); 
} 
+8

哪個'例外'? – thegauravmahawar

+1

如果你通過一個emty列表,你很好的超出範圍的異常;) – Maraboc

+1

你的代碼在我的電腦中工作正常,用java 1.7.045 –

回答

0

你最終達到在末端具有一個空的列表,並在:

l.add(l.get(0)+l.get(1));

它拼命地跑,你會得到搞好走出範圍異常。

所以不是:

if(l.size() != 1) 

你應該使用:

if(l.size() > 0) 
+0

這使得函數不安全,但是OP說:*它做它應該做的事,甚至打印出正確的值。但是由於某種原因,它也會拋出一個異常*,這不是'尺寸問題!= 1',因爲如果是這樣,代碼將不會從您的判斷中打印出正確的值 –

+0

我可以得出下一個結論:「也許引發異常的代碼甚至不是這個,我在這裏沒有看到任何printline :) – aurelius

+0

他可能總是在列表中的元素上使用奇數,這就是爲什麼它的工作原理 – aurelius

0

問題是if(l.size()!=1)如果l.size()== 0IndexOutOfBoundException

public static int addRekursive(List<Integer> l) { 

    if (l != null && !l.isEmpty()){ 
    if (l.size() > 1) { 
     l.add(l.get(0) + l.get(1)); 
     l.remove(1); 
     l.remove(0); 
     addRekursive(l); 
    } 
    return l.get(0); 
    } else { 
    return 0; 
    } 
} 
+0

這使得函數不安全,但OP說:*它做它應該做的,甚至打印出正確的價值。然而,由於某種原因,它也會拋出一個異常*,這不是'size!= 1'的問題,因爲如果是這樣,代碼將不會打印正確的值 –

+0

如果您添加了代碼片段來顯示如何正確執行它。 –

+0

@Markus W Mahlberg添加代碼片段 – Iffo

0

如果列表大小爲0,會引發IndexOutOfBoundException,你必須修改你的代碼t o避免它(-1表示沒有更多的元素,如果你想返回任何其他值),這樣

public static int addRekursive(List<Integer> l) { 
    if (l.size() >= 1) { 
     l.add(l.get(0) + l.get(1)); 
     l.remove(1); 
     l.remove(0); 
     addRekursive(l); 
    } 

    if (l.size() > 0) { 
     return l.get(0); 
    } else { 
     return -1; 
    } 
} 
+0

這使得函數不安全,但OP說:*它做它應該做的事情,甚至打印出正確的值。然而,由於某種原因,它也會拋出一個異常*,這不是'size!= 1'的問題,因爲如果是這樣,代碼將不會打印正確的值 –

+0

當他調用l.get(0)和列表大小爲0,即使條件'size!= 1'也不正確 –

+0

正如我所說的,這使得函數不安全,但沒有解釋所描述的行爲 –

0

我試圖this.Its完美的工作。(java版1.8.0_60

public static void main(String[] args) { 

     List<Integer> l = new ArrayList<Integer>(); 
     l.add(12); 
     l.add(13); 
     l.add(14); 
     l.add(15); 
     System.out.println(addRekursive(l)); 

    } 

    public static int addRekursive(List<Integer> l) { 
     if (l.size() != 1) { 
      l.add(l.get(0) + l.get(1)); 
      l.remove(1); 
      l.remove(0); 
      addRekursive(l); 
     } 
     return l.get(0); 
    } 

輸出

54 
+1

謝謝你的幫助....我終於把它工作了..只需重新啓動日食... – TorbenVerdorben

0

可能是因爲if條件。如果列表l爲空,那麼大小將爲零,並且if範圍中的語句將被執行。另外,如果列表爲空,那麼執行l.getSize()將拋出空指針異常。因此,請嘗試使用下面的代碼並查看是否仍拋出異常。

public int addRekursive(List<Integer> l){ 
    if(l != null && l.size() > 1){ 
      l.add(l.get(0)+l.get(1)); 
      l.remove(1); 
      l.remove(0); 
      addRekursive(l); 
    } 

    if(l != null){ 
      return l.get(0); 
    } 

    return null; 

} 
+0

感謝您的幫助! – TorbenVerdorben

0

爲避免你應該測試,如果列表不爲空,我用org.apache.commons.collections.CollectionUtils

,並添加回statment以前生產相同機能的研究return addRekursive(l);

public int addRekursive(List<Integer> l) { 
    if (CollectionUtils.isNotEmpty(l)) { 
     if (l.size() > 1) { 
      l.add(l.get(0) + l.get(1)); 
      l.remove(1); 
      l.remove(0); 
      return addRekursive(l); 
     } else { 
      return l.get(0); 
     } 
    } 
    return 0; 
} 

如果您的通話任何異常通過一個空列表,你會得到0

+0

@Jordi Castilla這個怎麼樣? – Maraboc

+0

@TorbenVerdorben即使您通過'null'也不會拋出異常 – Maraboc

+0

感謝您的意見。它正在工作。 – TorbenVerdorben