2015-11-17 48 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