{"id":100,"date":"2023-12-14T05:25:00","date_gmt":"2023-12-14T04:25:00","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=100"},"modified":"2024-01-08T09:13:02","modified_gmt":"2024-01-08T08:13:02","slug":"try-with-resources-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=100","title":{"rendered":"Try-with-resources in Java"},"content":{"rendered":"\n<p>Das <code>try-with-resources<\/code> Feature, das in Java ab Version 7 eingef\u00fchrt wurde, revolutionierte das Ressourcenmanagement in Java-Programmen. Es bietet eine elegante und sichere M\u00f6glichkeit, Ressourcen wie Dateien, Datenbankverbindungen oder Sockets zu verwenden und gleichzeitig sicherzustellen, dass sie nach ihrer Verwendung ordnungsgem\u00e4\u00df geschlossen werden. In diesem Artikel werden wir das <code>try-with-resources<\/code> Feature ausf\u00fchrlich erkl\u00e4ren, seine Vorteile erl\u00e4utern und anhand von Codebeispielen zeigen, wie es funktioniert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Problematik des Ressourcenmanagements in Java<\/h2>\n\n\n\n<p>In Java ist das ordnungsgem\u00e4\u00dfe Management von Ressourcen von entscheidender Bedeutung, da das Betriebssystem und die Java Virtual Machine (JVM) begrenzte Ressourcen wie Datei-Handles oder Netzwerkverbindungen zur Verf\u00fcgung stellen. Wenn diese Ressourcen nicht ordnungsgem\u00e4\u00df freigegeben werden, kann dies zu schwerwiegenden Problemen f\u00fchren, wie Ressourcenlecks oder die Ersch\u00f6pfung von Systemressourcen.<\/p>\n\n\n\n<p>Betrachten wir zun\u00e4chst eine herk\u00f6mmliche Methode zur Verwendung von Ressourcen in Java, die <code>try-catch-finally<\/code> Anweisung. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.io.BufferedReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.FileReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileReaderExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        BufferedReader reader = <span class=\"hljs-literal\">null<\/span>;\n        <span class=\"hljs-keyword\">try<\/span> {\n            reader = <span class=\"hljs-keyword\">new<\/span> BufferedReader(<span class=\"hljs-keyword\">new<\/span> FileReader(<span class=\"hljs-string\">\"sample.txt\"<\/span>));\n            <span class=\"hljs-built_in\">String<\/span> line;\n            <span class=\"hljs-keyword\">while<\/span> ((line = reader.readLine()) != <span class=\"hljs-literal\">null<\/span>) {\n                System.out.println(line);\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        } <span class=\"hljs-keyword\">finally<\/span> {\n            <span class=\"hljs-keyword\">try<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (reader != <span class=\"hljs-literal\">null<\/span>) {\n                    reader.close();\n                }\n            } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird eine Datei namens &#8222;sample.txt&#8220; ge\u00f6ffnet und zeilenweise gelesen. Nachdem das Lesen abgeschlossen ist, wird die Datei im <code>finally<\/code>-Block geschlossen. Dieses Muster erf\u00fcllt zwar seinen Zweck, ist aber un\u00fcbersichtlich und fehleranf\u00e4llig. Beispielsweise kann es vorkommen, dass die <code>close()<\/code>-Methode eine Ausnahme ausl\u00f6st, und im <code>catch<\/code>-Block wird diese Ausnahme einfach ignoriert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einf\u00fchrung in das try-with-resources Feature<\/h2>\n\n\n\n<p>Das <code>try-with-resources<\/code> Feature l\u00f6st diese Probleme und macht das Ressourcenmanagement in Java-Programmen effizienter und sicherer. Hier ist die gleiche Aufgabe wie oben, aber unter Verwendung von <code>try-with-resources<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.io.BufferedReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.FileReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TryWithResourcesExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> (BufferedReader reader = <span class=\"hljs-keyword\">new<\/span> BufferedReader(<span class=\"hljs-keyword\">new<\/span> FileReader(<span class=\"hljs-string\">\"sample.txt\"<\/span>))) {\n            <span class=\"hljs-built_in\">String<\/span> line;\n            <span class=\"hljs-keyword\">while<\/span> ((line = reader.readLine()) != <span class=\"hljs-literal\">null<\/span>) {\n                System.out.println(line);\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit <code>try-with-resources<\/code> haben wir den <code>finally<\/code>-Block vollst\u00e4ndig eliminiert und den Code erheblich vereinfacht. Aber wie funktioniert das genau?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie <code>try-with-resources<\/code> funktioniert<\/h2>\n\n\n\n<p><code>try-with-resources<\/code> f\u00fchrt eine automatische Ressourcenverwaltung ein, indem es sicherstellt, dass die Ressourcen am Ende des Blocks automatisch geschlossen werden, unabh\u00e4ngig davon, ob eine Ausnahme auftritt oder nicht. Hier ist, wie es funktioniert:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Die Ressourcen, die in einem <code>try-with-resources<\/code> Block verwendet werden sollen, werden in den Klammern nach dem <code>try<\/code> deklariert und initialisiert.<\/li>\n\n\n\n<li>W\u00e4hrend der Ausf\u00fchrung des Blocks werden die Ressourcen wie gewohnt verwendet.<\/li>\n\n\n\n<li>Nach Abschluss des Blocks werden die Ressourcen in umgekehrter Reihenfolge ihrer Deklaration automatisch geschlossen.<\/li>\n\n\n\n<li>Wenn w\u00e4hrend der Ausf\u00fchrung des Blocks oder beim Schlie\u00dfen der Ressourcen eine Ausnahme auftritt, wird diese Ausnahme an die Aufrufermethode weitergegeben, und alle anderen ausstehenden Ressourcen werden ebenfalls geschlossen.<\/li>\n<\/ol>\n\n\n\n<p>Dieses Verhalten garantiert, dass alle Ressourcen ordnungsgem\u00e4\u00df freigegeben werden, und macht den Code robuster und sicherer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorteile des <code>try-with-resources<\/code> Features<\/h2>\n\n\n\n<p>Das <code>try-with-resources<\/code> Feature bietet eine Reihe von Vorteilen gegen\u00fcber der herk\u00f6mmlichen <code>try-catch-finally<\/code> Methode:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>K\u00fcrzerer und lesbarerer Code<\/strong>: Der Code wird k\u00fcrzer und lesbarer, da Sie den <code>finally<\/code>-Block und die manuelle \u00dcberpr\u00fcfung auf <code>null<\/code> eliminieren k\u00f6nnen.<\/li>\n\n\n\n<li><strong>Sicherheit<\/strong>: Das automatische Schlie\u00dfen von Ressourcen minimiert das Risiko von Ressourcenlecks, da es unabh\u00e4ngig davon ist, ob eine Ausnahme auftritt oder nicht.<\/li>\n\n\n\n<li><strong>Bessere Fehlerdiagnose<\/strong>: Wenn w\u00e4hrend des Schlie\u00dfens einer Ressource eine Ausnahme auftritt, wird die urspr\u00fcngliche Ausnahme nicht unterdr\u00fcckt, sondern als &#8222;unterdr\u00fcckte Ausnahme&#8220; (suppressed exception) behandelt. Dies erleichtert die Fehlerdiagnose, da Sie alle relevanten Ausnahmen sehen k\u00f6nnen.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Mehrere Ressourcen in einem <code>try-with-resources<\/code> Block<\/h2>\n\n\n\n<p>Sie k\u00f6nnen mehrere Ressourcen in einem einzigen <code>try-with-resources<\/code> Block deklarieren und verwenden. Diese Ressourcen werden in der Reihenfolge deklariert, in der sie in den Klammern erscheinen, und in umgekehrter Reihenfolge geschlossen. Hier ist ein Beispiel, in dem sowohl eine Datei als auch eine Datenbankverbindung verwendet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.io.BufferedReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.FileReader;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n<span class=\"hljs-keyword\">import<\/span> java.sql.Connection;\n<span class=\"hljs-keyword\">import<\/span> java.sql.DriverManager;\n<span class=\"hljs-keyword\">import<\/span> java.sql.SQLException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MultipleResourcesExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> (\n            BufferedReader fileReader = <span class=\"hljs-keyword\">new<\/span> BufferedReader(<span class=\"hljs-keyword\">new<\/span> FileReader(<span class=\"hljs-string\">\"sample.txt\"<\/span>));\n            Connection databaseConnection = DriverManager.getConnection(<span class=\"hljs-string\">\"jdbc:mysql:\/\/localhost:3306\/mydb\"<\/span>, <span class=\"hljs-string\">\"user\"<\/span>, <span class=\"hljs-string\">\"password\"<\/span>)\n        ) {\n            <span class=\"hljs-comment\">\/\/ Code zum Lesen der Datei und Arbeiten mit der Datenbankverbindung<\/span>\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException | SQLException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel werden sowohl die <code>BufferedReader<\/code>-Instanz als auch die <code>Connection<\/code>-Instanz innerhalb desselben <code>try-with-resources<\/code> Blocks deklariert. Beide Ressourcen werden ordnungsgem\u00e4\u00df geschlossen, und im Falle von Ausnahmen werden alle ausstehenden Ressourcen geschlossen und die Ausnahmen als unterdr\u00fcckte Ausnahmen behandelt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schlussfolgerung<\/h2>\n\n\n\n<p>Das <code>try-with-resources<\/code> Feature in Java hat das Ressourcenmanagement in Java-Programmen erheblich verbessert. Es bietet eine elegante und sichere M\u00f6glichkeit, Ressourcen zu verwenden und sicherzustellen, dass sie ordnungsgem\u00e4\u00df geschlossen werden, selbst wenn Ausnahmen auftreten. Dies erleichtert die Entwicklung robuster und wartbarer Anwendungen erheblich und reduziert das Risiko von Ressourcenlecks.<\/p>\n\n\n\n<p>Es ist ratsam, <code>try-with-resources<\/code> immer dann zu verwenden, wenn Sie mit Ressourcen wie Dateien, Datenbankverbindungen oder Sockets arbeiten, um Ihren Code sicherer und effizienter zu gestalten. Die automatische Ressourcenverwaltung dieses Features spart Zeit und reduziert die Fehleranf\u00e4lligkeit erheblich.<\/p>\n\n\n\n<p>Insgesamt ist <code>try-with-resources<\/code> eine der bemerkenswertesten Verbesserungen in Java, die die Art und Weise, wie wir Ressourcen in Java-Programmen verwalten, grundlegend ver\u00e4ndert hat.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das try-with-resources Feature, das in Java ab Version 7 eingef\u00fchrt wurde, revolutionierte das Ressourcenmanagement in Java-Programmen. Es bietet eine elegante und sichere M\u00f6glichkeit, Ressourcen wie Dateien, Datenbankverbindungen oder Sockets zu verwenden und gleichzeitig sicherzustellen, dass sie nach ihrer Verwendung ordnungsgem\u00e4\u00df geschlossen werden. In diesem Artikel werden wir das try-with-resources Feature ausf\u00fchrlich erkl\u00e4ren, seine Vorteile erl\u00e4utern [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-100","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=100"}],"version-history":[{"count":2,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":102,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/100\/revisions\/102"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}