2015-11-17 2 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 сказал: * Он делает то, что должен делать и даже выводит правильное значение. Однако по какой-то причине он также генерирует исключение *, которое не является проблемой 'size!= 1', потому что если это так, код не выведет правильное значение –

+0

из вашего суждения. Я могу сделать следующий вывод: «Возможно, код, который выбрасывает это исключение, даже не этот. Я не вижу никаких строк печати здесь :) – aurelius

+0

он может всегда использовать нечетное число для элементов в списке, поэтому он работает – aurelius

0

Проблема заключается в том if(l.size()!=1) если l.size()== 0 вы получаете IndexOutOfBoundException

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 о избежать (-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

Спасибо за вашу помощь .... я, наконец, получил его на работу .. просто перезапустив eclipse ... – TorbenVerdorben

0

Может быть из-за условия if. Если список l пуст, тогда размер будет равен нулю, а операторы if-scope будут выполнены. Кроме того, если список равен нулю, то выполнение 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

И добавить обратный Постулаты Befor вызова того же Fuction 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

@ Джорди Кастилла Что относительно этого? – Maraboc

+0

@TorbenVerdorben с этим решением, даже если вы передадите «null», исключение не будет выбрано также – Maraboc

+0

Спасибо за ваши идеи. Он работает сейчас. – TorbenVerdorben

Смежные вопросы