Конструкция try с ресурсами
Конструкция try с ресурсами позволяет автоматически закрывать ресурсы (файлы, потоки, соединения), которые были открыты внутри круглых скобок. Такие ресурсы должны реализовывать интерфейс AutoCloseable. Метод close вызывается автоматически после завершения блока, даже если внутри произошло исключение. В круглых скобках можно объявлять один или несколько ресурсов через точку с запятой. Ресурсы закрываются в порядке, обратном их открытию.
Синтаксис
try (ResourceType res = new ResourceType())
{
// code that uses the resource
}
catch (ExceptionType e)
{
// exception handling
}
Пример
Давайте создадим собственный ресурс, реализующий AutoCloseable, и посмотрим, как он закрывается автоматически:
public class Main
{
public static void main(String[] args)
{
try (MyResource res = new MyResource())
{
res.doSomething();
}
catch (Exception e)
{
System.out.println("Caught: " + e.getMessage());
}
}
}
class MyResource implements AutoCloseable
{
public void doSomething()
{
System.out.println("Doing something");
}
@Override
public void close()
{
System.out.println("Resource closed");
}
}
Результат выполнения кода:
"Doing something"
"Resource closed"
Пример
Давайте убедимся, что ресурс закрывается даже при возникновении исключения:
public class Main
{
public static void main(String[] args)
{
try (MyResource res = new MyResource())
{
throw new RuntimeException("Something went wrong");
}
catch (RuntimeException e)
{
System.out.println("Caught: " + e.getMessage());
}
}
}
class MyResource implements AutoCloseable
{
@Override
public void close()
{
System.out.println("Resource closed");
}
}
Результат выполнения кода:
"Resource closed"
"Caught: Something went wrong"
Пример
Давайте откроем два ресурса одновременно, чтобы увидеть порядок их закрытия:
public class Main
{
public static void main(String[] args)
{
try (FirstResource first = new FirstResource();
SecondResource second = new SecondResource())
{
System.out.println("Using resources");
}
}
}
class FirstResource implements AutoCloseable
{
@Override
public void close()
{
System.out.println("First resource closed");
}
}
class SecondResource implements AutoCloseable
{
@Override
public void close()
{
System.out.println("Second resource closed");
}
}
Результат выполнения кода:
"Using resources"
"Second resource closed"
"First resource closed"