Класс UncheckedIOException
Класс UncheckedIOException наследуется от
RuntimeException и служит для обертывания
проверяемого исключения IOException в
непроверяемое. Это особенно удобно при работе
с лямбда-выражениями и Stream API, где нельзя
напрямую выбрасывать проверяемые исключения.
В конструктор первым параметром передается
сообщение об ошибке, вторым - исходный объект
IOException, который нужно обернуть.
Синтаксис
new UncheckedIOException(String message, IOException cause)
new UncheckedIOException(IOException cause)
Пример
Давайте обернем проверяемое исключение
IOException в непроверяемое и выбросим
его из метода, который не объявляет throws:
import java.io.IOException;
import java.io.UncheckedIOException;
public class Main
{
public static void main(String[] args)
{
try {
readData();
} catch (UncheckedIOException e) {
System.out.println("Caught: " + e.getMessage());
System.out.println("Cause: " + e.getCause().getMessage());
}
}
public static void readData()
{
try {
throw new IOException("File not found");
} catch (IOException e) {
throw new UncheckedIOException("Failed to read data", e);
}
}
}
Результат выполнения кода:
"Caught: Failed to read data"
"Cause: File not found"
Пример
Давайте используем UncheckedIOException
внутри лямбда-выражения, где проверяемое
исключение выбросить напрямую нельзя:
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List.of("abcde", "12345").forEach(s -> {
try {
process(s);
} catch (IOException e) {
throw new UncheckedIOException("Processing failed for: " + s, e);
}
});
}
public static void process(String s) throws IOException
{
if (s.length() > 3) {
throw new IOException("String too long");
}
System.out.println("Processed: " + s);
}
}
Результат выполнения кода:
Exception in thread "main" java.io.UncheckedIOException: Processing failed for: abcde
at Main.lambda$main$0(Main.java:11)
at java.base/java.util.List.forEach(List.java:1583)
at Main.main(Main.java:9)
Caused by: java.io.IOException: String too long
at Main.process(Main.java:18)
at Main.lambda$main$0(Main.java:9)
... 2 more
Пример
Давайте получим исходное исключение через
метод getCause и восстановим его тип:
import java.io.IOException;
import java.io.UncheckedIOException;
public class Main
{
public static void main(String[] args)
{
try {
throw new UncheckedIOException(
new IOException("Original error")
);
} catch (UncheckedIOException e) {
IOException cause = e.getCause();
System.out.println("Type: " + cause.getClass().getSimpleName());
System.out.println("Message: " + cause.getMessage());
}
}
}
Результат выполнения кода:
"Type: IOException"
"Message: Original error"
Смотрите также
-
класс
IOException,
который оборачивается в UncheckedIOException -
класс
RuntimeException,
родительский класс для UncheckedIOException -
оператор
throw,
который выбрасывает исключение -
конструкция
try-with-resources,
которая автоматически закрывает ресурсы