Advertentie
Een uitzondering bij het programmeren betekent op een bepaald moment in de uitvoering van het programma een uitzonderlijke toestand. Het wordt gebruikt wanneer de uitzonderlijke toestand elders beter kan worden behandeld dan waar het wordt aangetroffen. Beschouw de volgende voorbeelden:
- Het niet openen van een configuratiebestand kan beter hoger in de code worden afgehandeld, misschien door een alternatieve locatie voor het configuratiebestand te gebruiken.
- Toegang tot een array-item Hoe een Java ArrayList te gebruikenEen Java-arraylist is een voor algemene doeleinden aanpasbare array. Het biedt de meeste voorzieningen die algemeen worden verwacht van arrays in andere talen. In dit artikel leer je een arraylist in te stellen en te gebruiken. Lees verder buiten de grenzen van de array betekent een programmafout. Gelukkig debuggen!
- Een XML-parseerfout moet ter kennis van de gebruiker worden gebracht, zodat het XML-bestand kan worden gecorrigeerd.
- Het programma heeft onvoldoende geheugen (misschien bij het verwerken van een groot bestand) kan worden verholpen door misschien de hoeveelheid geheugen die beschikbaar is voor het Java-proces te vergroten.
In al deze gevallen (en meer) moet de uitzondering worden afgehandeld buiten de locatie waar deze wordt gegenereerd, zodat de onderliggende oorzaak kan worden aangepakt.
Soorten uitzonderingen
De onderstaande afbeelding toont de belangrijkste onderdelen van de Java-uitzonderingshiërarchie. De basisklasse is Gooi die is onderverdeeld in Uitzondering en Fout. Klasse Uitzondering is voor programmagerelateerde voorwaarden die toepassingen kunnen opvangen in een poging de situatie te redden. Klasse Foutaan de andere kant is het voor het aangeven van ernstige fouten in de Java Run-time Environment die applicaties niet zouden moeten opvangen. Enkele voorbeelden zijn: Onvoldoende geheugen fout en StackOverflowError.
Een Uitzondering er zijn weer twee soorten: aangevinkt en niet aangevinkt. Een aangevinkte uitzondering moet worden afgehandeld door de aanroepcode. Deze regel wordt afgedwongen door de java-compiler. Een ongecontroleerde uitzondering kan daarentegen in de gespreksketen worden gepropageerd zonder deze expliciet te hoeven aangeven. De onderstaande voorbeelden zullen dit verduidelijken.
Gecontroleerde uitzonderingen
De volgende methode probeert te creëren FileReader uit een bestand. De constructor genereert een aangevinkte uitzondering FileNotFoundException die moet worden afgehandeld door de aanroepcode of moet worden verklaard.
De volgende code zal niet compileren omdat het geen van beide doet.
private void loadFile (bestandsnaam van tekenreeks) {FileReader in = nieuwe FileReader (bestandsnaam); }
Een manier om de code te laten compileren, is door de uitzondering af te handelen (zie hieronder).
private void loadFile (bestandsnaam van tekenreeks) {probeer {FileReader in = nieuwe FileReader (bestandsnaam)); {} catch (FileNotFoundException ex) {// handvat uitzondering hier} }
Als de uitzondering niet rechtstreeks door de beller kan worden afgehandeld, moet deze worden aangegeven in de handtekening van de methode.
private void loadFile (String bestandsnaam) gooit java.io. FileNotFoundException. {FileReader in = nieuwe FileReader (bestandsnaam)); { }
Niet-gecontroleerde uitzonderingen
Een niet-gecontroleerde uitzondering is een uitzondering die wordt onderverdeeld RuntimeException en hoeft niet rechtstreeks te worden afgehandeld of zoals hierboven aangegeven. 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 inpakken
Gezien de bovenstaande discussie over aangevinkte en niet-gecontroleerde uitzonderingen, lijkt het erop dat het eenvoudiger is om met niet-gecontroleerde uitzonderingen om te gaan, omdat u ze niet hoeft aan te geven of zelf hoeft af te handelen. Met dat gemak in gedachten kan het soms handig zijn om een aangevinkte uitzondering in een niet-gecontroleerde uitzondering in te pakken.
Het volgende codevoorbeeld liet zien hoe een uitzondering moet worden ingepakt. De methode method_1 () gooit een SQLException in zijn lichaam. Om de code correct te laten compileren, moet worden verklaard dat de uitzondering is gegenereerd.
private void method_1 () gooit SQLException {... gooi nieuwe SQLException; }
Wanneer deze methode wordt aangeroepen vanuit 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 declareren in de handtekening van de methode.
private void method_2 () {probeer {method_1 (); } catch (java.sql. SQLException ex) {gooi nieuwe RuntimeException (ex); } }
Uitzondering Stack Trace
Een Exception Stack Trace verwijst naar de array van actieve stackframes, die elk een methode-aanroep vertegenwoordigen, vastgelegd door de JVM op het moment dat de uitzondering werd gegenereerd. Elk stapelframe bevat de locatie van de aanroep van de methode, inclusief de klassenaam, de naam van de methode en mogelijk de java-bronbestandsnaam en het regelnummer in het bestand. Dit is handig om de volgorde van oproepen te herleiden dat veroorzaakte de fout Java-uitzonderingen: behandelt u ze goed?Een uitzondering bij het programmeren betekent een uitzonderlijke toestand bij de uitvoering van het programma. Het wordt gebruikt wanneer de aandoening elders beter kan worden behandeld. Bekijk de volgende voorbeelden van de afhandeling van Java-uitzonderingen. Lees verder .
Hier is een typische stacktracering, verkregen van het uitzonderingsobject toen het werd opgevangen.
Uitzondering in thread "main" java.lang. IndexOutOfBoundsException: Index: 8, Size: 5 at java.util. ArrayList.rangeCheck (ArrayList.java: 653) op java.util. ArrayList.get (ArrayList.java: 429) bij sample.sample1.main (sample1.java: 24)
De uitzondering die hier wordt opgemerkt, is IndexOutOfBoundsException. Het bevat aanvullende informatie over de fout. De stacktracering bevat 3 stapelframes, die elk de locatiegegevens bevatten zoals weergegeven.
Afhandeling van uitzonderingen
Een uitzondering kan worden afgehandeld door deze op te vangen 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 de oorzaak is.
De volgende code legt het foutbericht vast in een logbestand.
private void loadConfig () {probeer {// aanroep code die een IOException} catch (java.io. IOException ex) {// regel hier de uitzondering. Mag een logbestand zijn. log.warning (ex.getMessage ()); } }
Wanneer een uitzondering in een andere is verpakt, kunt u de ingepakte uitzondering ophalen:
Wegwerpbare oorzaak = ex.getCause (); log.warning ("Onderliggende oorzaak:" + cause.getMessage ());
Heb je toegang nodig tot de stacktracering en misschien de naam van de methode die deze heeft veroorzaakt?
StringBuilder sbuf = nieuwe StringBuilder ("Stack Trace:"); voor (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
Of misschien de uitzondering vastleggen en opnieuw genereren?
proberen {... } vangen (java.io. IOException ex) {log.warning (ex.getMessage ()); gooi ex; }
De Uitzondering klasse biedt een printStackTrace () methode waarmee u de stacktrace naar uw eigen kunt afdrukken PrintStream (of PrintWriter).
proberen {... } vangen (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (uit); }
U kunt meerdere soorten uitzonderingen in één keer opvangen proberen blokkeren en voer een specifieke afhandeling uit voor elk type uitzondering.
probeer {// gooit hier enkele uitzonderingen. } vangen (java.io. IOException ex) {// IOException specifieke afhandeling hier. } catch (java.sql. SQLException ex) {// SQLException specifieke behandeling hier. }
Om meerdere soorten uitzonderingen op te vangen, maar dezelfde verwerkingscode te gebruiken, kunt u een vangst blok met meerdere typen als volgt:
probeer {// gooit hier enkele uitzonderingen. } vangen (java.io. IOException | java.sql. SQLException ex) {// IOException en SQLException specifieke afhandeling hier. } catch (SAXException ex) {// SAXException specifieke afhandeling hier. }
Bronnen opschonen met eindelijk
Bij het omgaan met code die uitzonderingen kan veroorzaken, is het essentieel om alle bronnen goed op te schonen, zoals geopende bestanden Alles wat u moet weten over bestandsindelingen en hun eigenschappenWe gebruiken het woordbestand onderling uitwisselbaar: muziek, afbeelding, spreadsheet, diavoorstelling, enzovoort. Maar wat maakt een bestand eigenlijk een "bestand"? Laten we proberen dit fundamentele onderdeel van computers te begrijpen. Lees verder , databaseverbindingen, etc. Het opschonen van bronnen moet worden uitgevoerd in een Tenslotte blok. Op deze manier roepen zowel normale uitgang als uitzonderlijke uitgang van een blok de opruimcode De 10 ergste programmeerfouten in de geschiedenisIn zijn legendarische verleden veroorzaakte codering ook vernietiging. Gevallen van een beetje slechte code veroorzaakten een ramp op een groot niveau. Hieronder volgen 10 van de ergste programmeerfouten in de geschiedenis. Lees verder .
InputStream in = null; proberen {... in = nieuwe FileInputStream (bestandsnaam);... } vangen (java.io. IOException ex) {log.warning (ex.getMessage ()); } tenslotte {// code hier wordt uitgevoerd bij het verlaten van het try-blok, // hetzij normaal of vanwege een uitzondering if (in! = null) in.close (); }
Probeer-met-middelen-blok
Java 1.7 introduceerde de probeer-met-middelen constructie die het opschonen van bronnen eenvoudiger maakt. Het ziet er zo uit:
probeer (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 opgeschoond.
Ruim meerdere bronnen op door ze allemaal in het blokhoofd te vermelden.
probeer (InputStream in = nieuwe FileInputStream (..); Verbinding con =...; ) {// code die de InputStream en de verbinding gebruikt. }
Elk object waarvan de klasse de AutoCloseable interface kan op deze manier worden opgeruimd. De volgende klasse voert een specifieke opruiming uit in de dichtbij() methode.
public class MyClass implementeert AutoCloseable {public void close () {// cleanup code here} }
Gebruik een instantie van deze klasse in een probeer-met-middelen blok.
probeer (MyClass obj = nieuwe MyClass (..)) {// code die het MyClass-object gebruikt. }
Enkele veelvoorkomende 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, string, etc. valt
- SQLException (aangevinkt): gegooid vanwege een databasefout.
- IOException (aangevinkt): bestandstoegangsfout of fouten die te maken hebben met invoer en uitvoer.
- Onderbroken uitzondering (aangevinkt): gegooid wanneer een threaduitvoering wordt onderbroken.
- SAXException (aangevinkt): gegenereerd vanwege XML-parseerfouten.
- NullPointerException (niet aangevinkt): null gebruiken waar een object vereist is.
Afsluiten
Uitzonderingen zijn de belangrijkste methode voor foutrapportage en beheer in Java. Correct gebruik van uitzonderingen codekwaliteit verbeteren Schrijf of codeer sneller in uw Linux-teksteditor met aangepaste thema'sUw 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 het gebruik van de tool als opmaakeditor? Lees verder en hulp bij het oplossen van problemen in de productie.
Heeft u uitzonderingsgerelateerde oorlogsverhalen om te vertellen? Zo ja, vertel het ons in de opmerkingen hieronder.
Beeldcredits: Dmitry Nikolaev via Shutterstock.com