Middle
217
Java-да try-мен ресурстар операторі қалай жұмыс істейді?
AI-дан жауап
sobes.tech AI
try-with-resources операторы java.lang.AutoCloseable интерфейсін жүзеге асыратын ресурстарды автоматты түрде жабуды қамтамасыз етеді.
Жұмыс механизмі:
tryкілттік сөзіне кейін жақша ішінде бір немесе бірнеше ресурстарды жариялау немесе инициализациялау жүргізіледі, олар нүктелі үтірмен бөлінген.- Бұл ресурстар
AutoCloseableинтерфейсін жүзеге асыруы керек, оның бір әдісіclose()бар:public interface AutoCloseable { void close() throws Exception; } tryблогы аяқталғаннан кейін (сәтті орындалған кезде де, қате болған кезде де) Java-машина автоматты түрде әр ресурстыңclose()әдісін шақырады, оларды жариялау тәртігінің кері бағытымен.- Егер
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();
}