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 шт):
Добавьте пожалуйста ошибку, потому что без нее не очень понятна проблема. Предполагаю , что ошибка на этапе проверки решения. Есть определенная вероятность , что из-за того , что вы на выход печатаете "Null" (по условию задачи в этом нет необходимости)
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");
}
А если отсечь всё лишнее?
long sum = 0;
for (int i = 0; i< array.length;i++) {
if (array[i] % 2 == 0) {
sum += array[i];
}
return sum;
Обновление: Ошибка:
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(); // корректная сумма
}
Итак, вся соль была в обработке исключения. После прохождения других курсов до меня дошло.
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;
}
}