Лямбда-выражение может генерировать исключение. Но если оно генерирует проверяемое исключение, то последнее должно быть совместимо с исключениями, перечисленными в выражении throws из объявления абстрактного метода в функциональном интерфейсе.
Эта особенность демонстрируется в приведенном ниже примере, где вычисляется среднее числовых значений типа double в массиве.
А если лямбда-выражению передается массив нулевой длины, то генерируется исключение типа EmptyArrayException.
Как следует из данного примера, это исключение перечислено в выражении throws из объявления метода func() в функциональном интерфейсе DoubleNumericArrayFunc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
// Сгенерировать исключение из лямбда-выражения interface DoubleNumericArrayFunc { double func(double[] n) throws EmptyArrayException; } class EmptyArrayException extends Exception { EmptyArrayException() { super("Массив пуст"); } } class LambdaExceptionDemo { public static void main(String args[]) throws EmptyArrayException { double[] values = { 1.0, 2.0, 3.0, 4.0 }; // В этом лямбда-выражении вычисляется среднее числовых // значений типа double в массиве DoubleNumericArrayFunc average = (n) -> { double sum = 0; if(n.length == 0) { throw new EmptyArrayException(); } for(int i = 0; i < n.length; i++) { sum += n[i]; } return sum / n.length; }; System.out.println("Среднее равно " + average.func(values)); // Эта строка кода приводит к генерированию исключения System.out.println("Среднее равно " + average.func(new double[0])); } } |
Программа выводит следующее:
1 2 3 4 5 6 7 |
pro-java.ru@admin:~$ javac lamexc.java pro-java.ru@admin:~$ java LambdaExceptionDemo Среднее равно 2.5 Exception in thread "main" EmptyArrayException: Массив пуст at LambdaExceptionDemo.lambda$main$0(lamexc.java:27) at LambdaExceptionDemo.main(lamexc.java:40) pro-java.ru@admin:~$ |
В результате первого вызова метода average.func() возвращается среднее значение 2.5. А при втором вызове этому методу передается массив нулевой длины, что приводит к генерированию исключения типа EmptyArrayException.
Напомним, что наличие выражения throws В объявлении метода func() обязательно.
Без этого программа не будет скомпилирована, поскольку лямбда-выражение перестанет быть совместимым с методом func().
Данный пример демонстрирует еще одну важную особенность лямбда-выражений. Обратите внимание на то, что параметр, указываемый при объявлении метода func() в функциональном интерфейсе DoubleNumericArrayFunc, обозначает массив, тогда как параметр лямбда-выражения просто указан как n, а не n[].
Напомним, что тип параметра лямбда-выражения выводится из целевого контекста. В данном случае целевым контекстом является массив типа double[], поэтому и параметр n относится к типу double[].
Следовательно, указывать этот параметр как n[] совсем не обязательно и даже недопустимо. И хотя его можно было бы явно указать как double[] n, это не дало бы в данном случае никаких преимуществ.