Java-uitzonderingen Behandelt u ze goed?

Java-uitzonderingen Behandelt u ze goed? / Programming

Een uitzondering in de programmering duidt op een uitzonderlijke situatie op een bepaald punt in de uitvoering van het programma. Het wordt gebruikt wanneer de uitzonderlijke conditie beter elders kan worden afgehandeld in plaats van waar deze wordt aangetroffen. Beschouw de volgende voorbeelden:

  • Het niet openen van een configuratiebestand kan beter in de code worden afgehandeld, bijvoorbeeld door een alternatieve locatie van het configuratiebestand te gebruiken.
  • Toegang tot een array-item Een Java ArrayList gebruiken Een Java ArrayList gebruiken Een Java-arraylist is een herbruikbare array voor algemeen gebruik. Het biedt de meeste voorzieningen die algemeen worden verwacht van arrays in andere talen. In dit artikel leert u een arraylist in te stellen en te gebruiken. Meer lezen buiten de grenzen van de array betekent een programmafout. Gelukkig debuggen!
  • Een XML-parseerfout moet onder de aandacht van de gebruiker worden gebracht, zodat het XML-bestand kan worden gecorrigeerd.
  • Het programma met onvoldoende geheugen (bijvoorbeeld bij het verwerken van een groot bestand) kan worden verholpen door mogelijk de hoeveelheid geheugen die beschikbaar is voor het Java-proces te vergroten.

In al deze gevallen (en meer) moet de uitzondering worden behandeld buiten de locatie waar deze is gegenereerd, zodat de onderliggende oorzaak kan worden verholpen.

Soorten uitzonderingen

De afbeelding hieronder toont de belangrijkste delen van de Java-uitzonderingshiërarchie. De basisklasse is Throwable die is onderverdeeld in Uitzondering en Fout. Klasse Uitzondering is voor programma-gerelateerde voorwaarden die toepassingen kunnen vangen in een poging om de situatie te redden. Klasse Fout, aan de andere kant, is voor het aanduiden van ernstige fouten in de Java Run-time Environment die applicaties niet zouden moeten vangen. Voorbeelden zijn: Onvoldoende geheugen fout en StackOverflowError.

Een Uitzondering opnieuw is er twee soorten: aangevinkt en uitgeschakeld. Een gecontroleerde uitzondering moet worden afgehandeld door de aanroepcode. Deze regel wordt afgedwongen door de java-compiler. Een niet-gecontroleerde uitzondering kan daarentegen in de oproepketen worden gepropageerd zonder deze expliciet te hoeven aangeven. De onderstaande voorbeelden verduidelijken.

Gecontroleerde uitzonderingen

De volgende methode probeert te maken FileReader van een bestand. De constructor gooit een gecontroleerde uitzondering FileNotFoundException die moet worden afgehandeld door de aanroepende code of moet worden gegooid.

De volgende code zal niet compileren omdat het geen van beide doet.

private void loadFile (String bestandsnaam) FileReader in = nieuwe FileReader (bestandsnaam);  

Een manier om de code te laten compileren is om met de uitzondering om te gaan (zie hieronder).

private void loadFile (String bestandsnaam) try FileReader in = nieuwe FileReader (bestandsnaam));  catch (FileNotFoundException ex) // hier een uitzondering behandelen 

Als de uitzondering niet direct door de beller kan worden afgehandeld, moet deze worden gedeclareerd in de methodesignatuur.

private void loadFile (String bestandsnaam) gooit java.io.FileNotFoundException FileReader in = nieuwe FileReader (bestandsnaam));  

Niet-gecontroleerde uitzonderingen

Een niet-gecontroleerde uitzondering is een uitzondering waarvan een subklasse is gemaakt RuntimeException en hoeven niet direct afgehandeld of verklaard te worden zoals hierboven. De volgende code resulteert bijvoorbeeld in een NullPointerException, wat een type is RuntimeException. De code compileert echter sindsdien foutloos NullPointerException is een niet-gecontroleerde uitzondering.

private void handleEvent () String name = null; if (name.length ()> 0)  

Uitzonderingen in de verpakking

Gezien de bovenstaande discussie over gecontroleerde en niet-gecontroleerde uitzonderingen, lijkt het gemakkelijker om met niet-gecontroleerde uitzonderingen om te gaan, omdat u ze niet zelf hoeft te declareren of afhandelen. Met dat gemak in gedachten, kan het soms handig zijn om een ​​gecontroleerde uitzondering in een niet-gecontroleerde uitzondering te verwerken.

Het volgende codevoorbeeld laat zien hoe een uitzondering moet worden ingepakt. De methode method_1 () gooit een SQLException in zijn lichaam. Voor de juiste compilatie van de code moet worden aangegeven dat de uitzondering is gegenereerd.

private void method_1 () gooit SQLException ... gooi nieuwe SQLException;  

Wanneer deze methode wordt aangeroepen vanaf een andere methode (method_2 ()), kan die methode de SQLException en wikkel het in een niet-gecontroleerde uitzondering, zodat het de uitzondering niet hoeft te verklaren in zijn methodesignatuur.

private void method_2 () try method_1 ();  catch (java.sql.SQLException ex) gooi nieuwe RuntimeException (ex);  

Uitzondering Stack Trace

Een uitzonderingstapeltracering verwijst naar de reeks actieve stapelframes, die elk een methode-aanroep vertegenwoordigen, vastgelegd door de JVM op het moment dat de uitzondering werd gegenereerd. Elk stackframe bevat de locatie van de aanroep van de methode, inclusief de klassenaam, de naam van de methode en mogelijk de naam en het regelnummer van de java-bronbestand in het bestand. Het is handig voor het opsporen van de reeks oproepen die de fout veroorzaakten Java-uitzonderingen: behandelt u ze goed? Java-uitzonderingen: behandelt u ze goed? Een uitzondering in programmering betekent een uitzonderlijke voorwaarde bij het uitvoeren van het programma. Het wordt gebruikt wanneer de aandoening elders beter kan worden afgehandeld. Overweeg de volgende voorbeelden van de afhandeling van Java-uitzonderingen. Lees verder .

Hier is een typisch stacktracé, verkregen uit het exception-object toen het werd gepakt.

Uitzondering in thread "main" java.lang.IndexOutOfBoundsException: Index: 8, Size: 5 at java.util.ArrayList.rangeCheck (ArrayList.java:653) bij java.util.ArrayList.get (ArrayList.java:429) bij sample.sample1.main (sample1.java:24) 

De uitzondering die hier wordt gevangen is IndexOutOfBoundsException. Het bevat aanvullende informatie over de fout. De stacktracering bevat 3 stapelframes, die elk de locatie-informatie bevatten zoals weergegeven.

Uitzonderingen verwerken

Een uitzondering kan worden afgehandeld door deze in een proberen te vangen blokkeren en alle corrigerende maatregelen nemen die nodig zijn. De Uitzondering object biedt verschillende methoden voor het extraheren van informatie over de aandoening die deze heeft veroorzaakt.

De volgende code logt het foutbericht naar een logbestand.

private void loadConfig () try // voer code in die mogelijk een IOException catch (java.io.IOException ex) // uitzonderingsregel hier genereert. Kan log zijn naar een logbestand. log.warning (ex.getMessage ());  

Wanneer een uitzondering in een andere is gewikkeld, kunt u de ingepakte uitzondering ophalen:

Throwable cause = ex.getCause (); log.warning ("Onderliggende oorzaak:" + cause.getMessage ()); 

Moet u toegang krijgen tot de stacktracering en misschien de naam van de methode die deze heeft veroorzaakt extraheren?

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n");  log.warning (sbuf.toString ()); 

Of log misschien de uitzondering in en gooi het opnieuw?

probeer ... vangst (java.io.IOException ex) log.warning (ex.getMessage ()); gooi ex;  

De Uitzondering klasse biedt een printStackTrace () methode die het stapeltracé naar uw eigen spoor kan afdrukken PrintStream (of PrintWriter).

probeer ... vangst (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (out);  

Je kunt meerdere soorten uitzonderingen in één enkel spel vangen proberen blokkeren en voer specifieke afhandeling uit voor elk type uitzondering.

probeer // genereert enkele uitzonderingen hier catch (java.io.IOException ex) // IOException-specifieke verwerking hier catch (java.sql.SQLException ex) // Specifieke behandeling met SQLException hier 

Als u meerdere uitzonderingstypen wilt vangen maar dezelfde verwerkingscode wilt gebruiken, kunt u a. Declareren vangst blok met meerdere typen als volgt:

probeer // genereert hier enkele uitzonderingen catch (java.io.IOException | java.sql.SQLException ex) // IOException en SQLException-specifieke afhandeling hier catch (SAXException ex) // Specifieke SAXException-afhandeling hier 

Hulpmiddelen opruimen met tot slot

Wanneer het om code gaat die uitzonderingen kan werpen, is het van essentieel belang dat alle bronnen correct worden opgeruimd, zoals geopende bestanden Alles wat u moet weten over bestandsindelingen en hun eigenschappen Alles wat u moet weten over bestandsindelingen en hun eigenschappen We gebruiken het woord bestand uitwisselbaar: muziek, afbeelding, spreadsheet, diavoorstelling, enzovoort. Maar wat maakt een bestand eigenlijk tot een "bestand"? Laten we dit fundamentele onderdeel van computergebruik proberen te begrijpen. Meer informatie, databaseverbindingen, enz. Het opruimen van bronnen moet worden uitgevoerd in a Tenslotte blok. Op deze manier roepen zowel de normale exit als de exceptionele exit van een blok de schoonmaakcode op De 10 slechtste programmeerfouten in de geschiedenis De 10 slechtste programmeerfouten in de geschiedenis In het legendarische verleden codeerde ook vernietiging. Gevallen van een klein beetje slechte code veroorzaakten rampspoed op een belangrijk niveau. De volgende zijn 10 van de slechtste programmeerfouten in de geschiedenis. Lees verder .

InputStream in = null; probeer ... in = nieuwe FileInputStream (bestandsnaam); ... catch (java.io.IOException ex) log.warning (ex.getMessage ());  tenslotte // code hier wordt uitgevoerd bij het verlaten van het try-blok, // normaal of door een uitzondering als (in! = null) in.close ();  

Try-With-Resources Block

Java 1.7 introduceerde de try-met-resources constructie die het opruimen van bronnen eenvoudiger maakt. Het ziet er zo uit:

try (InputStream in = nieuwe FileInputStream (...)) // code die de InputStream gebruikt.  

Wanneer de code het blok verlaat (schoon of vanwege een uitzondering), de InputStream variabele wordt automatisch opgeruimd.

Ruim meerdere bronnen op door ze allemaal in het hoofd van het blok te declareren.

try (InputStream in = nieuwe FileInputStream (...); Connection con = ...;) // code die de InputStream en de Connection gebruikt.  

Elk object waarvan de klasse de. Implementeert AutoCloseable interface kan op deze manier worden opgeruimd. De volgende klasse voert een specifieke opschoning uit in de dichtbij() methode.

openbare klasse MyClass implementeert AutoCloseable public void close () // cleanup-code hier 

Gebruik een exemplaar van deze klasse in a try-met-resources blok.

try (MyClass obj = nieuwe MyClass (...)) // code die het object MyClass gebruikt.  

Enkele veel voorkomende uitzonderingen

Laten we nu eens kijken naar enkele veel voorkomende uitzonderingen.

  • IndexOutOfBoundsException (niet aangevinkt): geeft aan dat de index van het element dat wordt benaderd, buiten de grenzen van een array, tekenreeks, enzovoort valt.
  • SQLException (aangevinkt): gegooid vanwege een databasefout.
  • IOException (aangevinkt): bestandstoegangsfout of fouten die te maken hebben met invoer en uitvoer.
  • InterruptedException (aangevinkt): gegooid wanneer een thread-uitvoering wordt onderbroken.
  • SAXException (aangevinkt): gegooid vanwege XML-parseerfouten.
  • NullPointerException (niet aangevinkt): gebruik nul wanneer een object vereist is.

Afsluiten

Uitzonderingen zijn de primaire methode voor foutrapportage en -beheer in Java. Correct gebruik van uitzonderingen verbetert de codekwaliteit Schrijf of codeer sneller in uw Linux-teksteditor met aangepaste thema's Schrijf of codeer sneller in uw Linux-teksteditor met aangepaste thema's Uw Linux-teksteditor hoeft er niet saai en "functioneel" uit te zien. Waarom zou u het niet aanpassen om uw productiviteit te verbeteren, of het nu gaat om scripting en codering of om de tool te gebruiken als een markup-editor? Meer lezen en helpen bij het oplossen van problemen in de productie.

Heb je een of meer aan uitzonderingen gerelateerde oorlogsverhalen te vertellen? Zo ja, vertel het ons dan in de comments hieronder.

Beeldcredits: Dmitry Nikolaev via Shutterstock.com

Ontdek meer over: Java, Programmeren.