Context
- You can use lambda as lazy evaluation syntax in Java.
Problem
You can wrap RuntimeException
with lambda like (it shows "omit exception"
):
import java.util.function.Supplier;
public class OmitRuntimeException {
public static void main(String[] args) {
OmitRuntimeException o = new OmitRuntimeException();
o.wrapLambda(() -> o.throwException());
}
public void wrapLambda(Supplier<String> msg) {
try {
System.out.println(msg.get());
} catch (Exception e) {
System.out.println("omit exception");
}
}
public String throwException() throws RuntimeException {
if (true) {
throw new RuntimeException();
}
return "";
}
}
But you cannot wrap ordinal Exception
with lambda like:
import java.util.function.Supplier;
public class OmitException {
public static void main(String[] args) {
OmitException o = new OmitException();
o.wrapLambda(() -> o.throwException());
}
public void wrapLambda(Supplier<String> msg) {
try {
System.out.println(msg.get());
} catch (Exception e) {
System.out.println("omit exception");
}
}
public String throwException() throws Exception {
if (true) {
throw new Exception();
}
return "";
}
}
And you will get a compile error:
$ LANG=C javac OmitException.java
OmitException.java:6: error: unreported exception Exception; must be caught or declared to be thrown
o.wrapLambda(() -> o.throwException());
^
1 error
Solution:
Use RuntimeException
, or wrap the function that thows checked exceptions with another function.