Sobes.tech
Middle
217

Java-да try-мен ресурстар операторі қалай жұмыс істейді?

AI-дан жауап

sobes.tech AI

try-with-resources операторы java.lang.AutoCloseable интерфейсін жүзеге асыратын ресурстарды автоматты түрде жабуды қамтамасыз етеді.

Жұмыс механизмі:

  1. try кілттік сөзіне кейін жақша ішінде бір немесе бірнеше ресурстарды жариялау немесе инициализациялау жүргізіледі, олар нүктелі үтірмен бөлінген.
  2. Бұл ресурстар AutoCloseable интерфейсін жүзеге асыруы керек, оның бір әдісі close() бар:
    public interface AutoCloseable {
        void close() throws Exception;
    }
    
  3. try блогы аяқталғаннан кейін (сәтті орындалған кезде де, қате болған кезде де) Java-машина автоматты түрде әр ресурстың close() әдісін шақырады, оларды жариялау тәртігінің кері бағытымен.
  4. Егер try блогында немесе ресурстарды жабу кезінде қателер туса:
    • Егер try блогында және ресурсты жабу кезінде қате шықса, try блогындағы қате негізгі болып табылады, ал ресурсты жабу кезінде шыққан қате жабылады (suppressed) және негізгі қателіктің getSuppressed() әдісі арқылы алуға болады.
    • Егер қате тек ресурсты жабу кезінде шықса, ол ары қарай таратылады.

Артықшылықтары:

  • Кодты жеңілдетеді және ресурстардың ағылуын болдырмайды.
  • close() әдісін finally блогында шақыру қажеттілігін жояды.
  • Негізгі блокта және ресурстарды жабу кезінде шыққан қателерді дұрыс өңдеуге мүмкіндік береді.

Мысал:

finally қолдану арқылы дәстүрлі тәсіл:

// Ресурсты нақты жабу `finally` ішінде
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("file.txt"));
    String line = reader.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

try-with-resources қолдану:

// Ресурсты автоматты түрде жабу
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = reader.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
}

Көп ресурстар:

// Бірнеше ресурс, олар жариялау тәртібімен кері бағытта жабылады
try (
    FileInputStream fis = new FileInputStream("in.txt");
    FileOutputStream fos = new FileOutputStream("out.txt")
) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}