Јава-проба са ресурсима (са примерима)

У овом упутству ћемо научити о изјави три-витх-ресоурцес за аутоматско затварање ресурса.

try-with-resourcesСаопштењу се аутоматски затвара све ресурсе на крају изјаве. Ресурс је објекат који се затвара на крају програма.

Његова синтакса је:

 try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block ) 

Као што се види из горње синтаксе, изјаву изјављујемо try-with-resources,

  1. декларисање и инстанцирање ресурса унутар tryклаузуле.
  2. навођење и руковање свим изузецима који могу настати приликом затварања ресурса.

Напомена: Извјештај три-витх-ресоурцес затвара све ресурсе који имплементирају интерфејс АутоЦлосеабле.

Узмимо пример који спроводи try-with-resourcesизјаву.

Пример 1: пробајте са ресурсима

 import java.io.*; class Main ( public static void main(String() args) ( String line; try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) ( while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) ) ) 

Излаз ако датотека тест.ткт није пронађена.

 ИОЕкцептион у блоку три-витх-ресоурцес => тест.ткт (Нема такве датотеке или директоријума) 

Излаз ако је пронађена датотека тест.ткт.

 Унос блока три-витх-ресоурцес Лине => тест линија 

У овом примеру користимо инстанцу БуффередРеадер за читање података из test.txtдатотеке.

Декларирање и инстанцирање БуффередРеадер-а унутар try-with-resourcesизраза осигурава да је његова инстанца затворена без обзира на то да ли се tryизраз довршава нормално или баца изузетак.

Ако се догоди изузетак, њиме се може руковати помоћу блокова за руковање изузецима или кључне речи тхровс.

Потиснути изузеци

У горњем примеру, изузеци се могу избацити из try-with-resourcesизјаве када:

  • Датотека test.txtније пронађена.
  • Затварање BufferedReaderобјекта.

Изузетак се такође може избацити из tryблока јер читање датотеке у било које време може из многих разлога пропасти.

Ако се изузеци избацују и из tryблока и из try-with-resourcesизраза, изузетак из tryблока се баца и изузетак из try-with-resourcesизраза се сузбија.

Преузимање потиснутих изузетака

У Јави 7 и новијим, потиснути изузеци се могу добити позивањем Throwable.getSuppressed()методе из изузетка који је бацио tryблок.

Ова метода враћа низ свих потиснутих изузетака. Потиснуте изузетке добијамо у catchблоку.

 catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) ) 

Предности коришћења три-витх-ресоурцес

Ево предности коришћења три-витх-ресоурцес:

1. коначно блок није потребан за затварање ресурса

Пре него што је Јава 7 представила ову функцију, морали смо да користимо finallyблок како бисмо осигурали да је ресурс затворен како би се избегло цурење ресурса.

Ево програма који је сличан примеру 1 . Међутим, у овом програму користили смо коначно блок за затварање ресурса.

Пример 2: Затворите ресурс помоћу блока коначно

 import java.io.*; class Main ( public static void main(String() args) ( BufferedReader br = null; String line; try ( System.out.println("Entering try block"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) finally ( System.out.println("Entering finally block"); try ( if (br != null) ( br.close(); ) ) catch (IOException e) ( System.out.println("IOException in finally block =>"+e.getMessage()); ) ) ) ) 

Оутпут

 Унос покушај блок Лине => линија из датотеке тест.ткт Унос коначно блок 

Као што видимо из горњег примера, употреба finallyблока за чишћење ресурса чини код сложенијим.

Приметили сте и try… catchблок у finallyблоку? То је зато што се ан IOExceptionможе догодити и приликом затварања BufferedReaderинстанце унутар овог finallyблока, тако да се и он хвата и њиме се рукује.

try-with-resourcesИзјава се аутоматски управљање ресурсима . Не морамо изричито затварати ресурсе јер их ЈВМ аутоматски затвара. Ово чини код читљивијим и лакшим за писање.

2. пробајте са ресурсима са више ресурса

У изјави можемо пријавити више ресурса тако што ћемо try-with-resourcesих одвојити тачком и зарезом;

Пример 3: покушајте са више ресурса

 import java.io.*; import java.util.*; class Main ( public static void main(String() args) throws IOException( try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) ( while (scanner.hasNext()) ( writer.print(scanner.nextLine()); ) ) ) ) 

Ако се овај програм изврши без генерисања изузетака, Scannerобјект чита линију из testRead.txtдатотеке и записује је у нову testWrite.txtдатотеку.

Када се направи више декларација, try-with-resourcesизјава затвара ове ресурсе обрнутим редоследом. У овом примеру се PrintWriterобјекат прво затвара, а затим Scannerсе затвара.

Побољшање Јава 9 са искуством

У Јави 7 постоји ограничење на try-with-resourcesизјаву. Ресурс треба декларисати локално у оквиру свог блока.

 try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code ) 

Да смо извор прогласили изван блока у Јави 7, генерисао би поруку о грешци.

 Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code ) 

Да би се носила са овом грешком, Јава 9 је побољшала try-with-resourcesизраз тако да се референца ресурса може користити чак и ако није декларисана локално. Горњи код ће се сада извршити без грешке у компилацији.

Занимљиви Чланци...