Java: Правильность проверки массива на !=null. Соответствие решения условиям задачи

Есть задача:

Перейдите в класс SumOfEvenNumbers и реализуйте метод sum. Правильная реализация должна получить массив значений int и вернуть сумму четных чисел.

Подробности:

Если данный массив равен нулю или пуст, метод возвращает 0. Метод sum не должен изменять массив. Входной массив может содержать любое значение типа int от Integer.MIN_VALUE до Integer.MAX_VALUE.

Мое решение:

package com.epam.rd.autotasks.arrays;



public class SumOfEvenNumbers {

    public static void main(String[] args) {
        int[] array = new int[]{1, 3, 2, 8, 15, 199};

        System.out.println(sum(array));
    }

    public static Long sum(int[] array) {

        long sum = 0;
        if (array.length != 0) {
            for (int i = 0; i< array.length;i++) {
                if (array[i] % 2 == 0 && i !='\0') {
                    sum += array[i];
                }
            }
        } else {
            System.out.println("Null");
        }
        return sum;

        //put your code here
    }
}

При прогоне тестов ошибка. Писал for (int i : array) -> array[i] менял на i. Не пониманию ошибку. Курс EPAM

Ошибка Test set: com.epam.rd.autotasks.arrays.Tests

Tests run: 14, Failures: 0, Errors: 14, Skipped: 0, Time elapsed: 0.283 s <<< FAILURE! - in com.epam.rd.autotasks.arrays.Tests
com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[1]  Time elapsed: 0.084 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[2]  Time elapsed: 0.003 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[3]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[4]  Time elapsed: 0.004 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[5]  Time elapsed: 0.003 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[6]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[7]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[8]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[9]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[10]  Time elapsed: 0.001 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[11]  Time elapsed: 0.003 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[12]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.sumTest(int, int[])[13]  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

com.epam.rd.autotasks.arrays.Tests.nullOrEmptyTest  Time elapsed: 0.002 s  <<< ERROR!
java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I
    at com.epam.rd.autotasks.arrays.Tests.nullOrEmptyTest(Tests.java:48)

Код Теста

package com.epam.rd.autotasks.arrays;


public class Tests {

    @ParameterizedTest(name = "[{index}] [{0}]")
    @MethodSource("testCases")
    public void sumTest(int expected, int[] array) {
        assertEquals(expected, SumOfEvenNumbers.sum(array));
    }

    public static Stream<Arguments> testCases() {
        return Stream.of(
                arguments(10, new int[]{1, 3, 2, 8, 15, 199}),
                arguments(208, new int[]{1, 3, 2, 8, 198, 15}),
                arguments(0, IntStream.generate(() -> 1).limit(1000).toArray()),
                arguments(2000, IntStream.generate(() -> 2).limit(1000).toArray()),
                arguments(0, IntStream.generate(() -> 0).limit(1000).toArray()),
                arguments(250500, IntStream.iterate(1, i -> i + 1).limit(1000).toArray()),
                arguments(4840, IntStream.iterate(1, i -> i + 3).limit(80).toArray()),
                arguments(1048574, IntStream.iterate(1, i -> i + i).limit(20).toArray()),
                arguments(0, IntStream.iterate(1, i -> -i).limit(80).toArray()),
                arguments(-1560, IntStream.iterate(1, i -> i - 1).limit(80).toArray()),
                arguments(50, IntStream.iterate(50, i -> i - 1).limit(100).toArray()),
                arguments(-4900, IntStream.iterate(50, i -> i - 2).limit(100).toArray()),
                arguments(-4850, IntStream.iterate(50, i -> i - 3).limit(100).toArray())
        );
    }


    @Test
    public void nullOrEmptyTest() {
        int[] nullArray = null;
        int[] emptyArray = new int[0];

        assertEquals(0, SumOfEvenNumbers.sum(nullArray));
        assertEquals(0, SumOfEvenNumbers.sum(emptyArray));
    }
}

Ответы (5 шт):

Автор решения: NeckNecson

Добавьте пожалуйста ошибку, потому что без нее не очень понятна проблема. Предполагаю , что ошибка на этапе проверки решения. Есть определенная вероятность , что из-за того , что вы на выход печатаете "Null" (по условию задачи в этом нет необходимости)

→ Ссылка
Автор решения: Klioda

i !='\0' в данном случае лишь пропускает первый элемент массива, и в Java так не пишут, возможно это из Си. Вместо этого стоит добавить проверку на null в первый if:

if (array != null && array.length != 0) {
    for (int i = 0; i< array.length;i++) {
        if (array[i] % 2 == 0) {
            sum += array[i];
        }
    }
} else {
    System.out.println("Null or empty");
}
→ Ссылка
Автор решения: MBo

А если отсечь всё лишнее?

long sum = 0;
for (int i = 0; i< array.length;i++) {
        if (array[i] % 2 == 0) {
            sum += array[i];
        }
return sum;
→ Ссылка
Автор решения: Nowhere Man

Обновление: Ошибка:

java.lang.NoSuchMethodError: com.epam.rd.autotasks.arrays.SumOfEvenNumbers.sum([I)I at com.epam.rd.autotasks.arrays.Tests.sumTest(Tests.java:21)

означает, что код в тестовом методе sumTest на 21 строке класса Tests пытается вызвать метод, который принимает на вход массив целых чисел типа int [I, и возвращает целое число типа int, на что указывает буква I после закрывающей скобки.

Вам нужно сравнить входной массив с null, иначе в строчке if (array.length == 0) будет выброшено знаменитое исключение NullPointerException. Также необходимо изменить сигнатуру метода sum, чтобы она соответствовала ожидаемой, и не возникала ошибка теста:

public static int sum(int ... arr) {
    int total = 0;
    if (null != arr) {
        for (int n : arr) {
            if (n % 2 == 0) {
                total += n;
            }
        }
    }
    return total;
}

В функциональном стиле с использованием Optional и Stream API:

public static int sum(int ... arr) {
    return Optional.ofNullable(arr)
        .map(IntStream::of)        // IntStream
        .orElse(IntStream.empty()) // пустой стрим если входной массив null
        .filter(n -> (n & 1) == 0) // проверка на четность по младшему разряду
        .sum();                    // корректная сумма
}
→ Ссылка
Автор решения: ya Vodyanoy

Итак, вся соль была в обработке исключения. После прохождения других курсов до меня дошло.

public class SumOfEvenNumbers {
    public static void main(String[] args) {
        int[] array = new int[]{1, 3, 2, 8, 15, 199};
        System.out.println(sum(array));
    }

    public static int sum(int[] array) {
        try {

            int x = 0;
            for (int i = 0; i < array.length; i++) {
                if (array[i] % 2 == 0) {
                    x += array[i];
                }
            }
            return x;
        } catch (NullPointerException e) {
            System.out.println(0);
        }
       return 0;
    }
}
→ Ссылка