Tässä opetusohjelmassa opimme käyttämään heitto ja heitto -avainsanaa poikkeusten käsittelyyn esimerkkien avulla.
Javassa poikkeukset voidaan luokitella kahteen tyyppiin:
- Valitsematta Poikkeukset: Niitä ei tarkisteta käännettäessä mutta ajon time.For esimerkki:
ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException, poikkeustenErrorluokka jne - Tarkistetut poikkeukset: Ne tarkistetaan kokoamisajankohtana. Esimerkiksi
IOException,InterruptedExceptionjne
Katso Java-poikkeukset saadaksesi lisätietoja tarkistetuista ja tarkistamattomista poikkeuksista.
Yleensä meidän ei tarvitse käsitellä tarkistamattomia poikkeuksia. Se johtuu siitä, että tarkistamattomia poikkeuksia tapahtuu ohjelmointivirheiden vuoksi. Ja on hyvä käytäntö korjata ne käsittelyn sijaan.
Tämä opetusohjelma keskittyy nyt tarkastettujen poikkeusten käsittelemiseen käyttämällä throwja throws.
Java heittää avainsanan
Käytämme throwsavainsanaa method-ilmoituksessa ilmoittaaksemme siinä mahdollisesti esiintyvät poikkeukset.
Sen syntaksi on:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Kuten yllä olevasta syntaksista näet, voimme käyttää throwsuseita poikkeuksia.
Esimerkki 1: Java heittää avainsanan
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Tuotos
java.io.FileNotFoundException: test.txt (ei tällaista tiedostoa tai hakemistoa)
Kun suoritamme tämän ohjelman, jos tiedostoa test.txtei ole, FileInputStreamheittää a, FileNotFoundExceptionjoka laajentaa IOExceptionluokkaa.
Jos menetelmä ei käsittele poikkeuksia, siinä mahdollisesti esiintyvien poikkeusten tyyppi on määriteltävä throwslausekkeessa, jotta puhelupinossa ylhäällä olevat menetelmät voivat käsitellä niitä tai määrittää ne throwsitse avainsanalla.
findFile()Menetelmä määrittää, että IOExceptionvoidaan heittää. main()Metodikutsuja tätä menetelmää ja käsittelee poikkeus, jos se on heitetty.
Useiden poikkeusten heittäminen
Näin voimme heittää useita poikkeuksia throwsavainsanalla.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Tässä findFile()menetelmässä vahvistetaan, että se voi heittää NullPointerException, IOExceptionja InvalidClassExceptionsen throwslauseke.
Huomaa, että emme ole käsitelleet NullPointerException. Tämä johtuu siitä, että se on tarkistamaton poikkeus. Sitä ei tarvitse määrittää throwslausekkeessa ja käsitellä sitä.
heittää avainsanan vs. yritä … kiinni … vihdoin
Poikkeuksia voi olla useita. try… catchKunkin menetelmän kirjoittaminen on työlästä ja koodista tulee pitkä ja vähemmän luettavissa.
throws on hyödyllinen myös silloin, kun olet tarkistanut poikkeuksen (käsiteltävä poikkeus), jota et halua saada kiinni nykyisellä menetelmällä.
Java-heitto-avainsana
throwAvainsanaa käytetään nimenomaan heittää yksi poikkeus.
Kun heitetään poikkeus, ohjelman suorituksen kulku siirtyy trylohkosta catchlohkoon. Käytämme throwavainsanaa menetelmän sisällä.
Sen syntaksi on:
throw throwableObject;
Heitettävä esine on luokan Throwabletai luokan alaluokka Throwable.
Esimerkki 2: Java-heitto-avainsana
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Tuotos
Poikkeus säikeessä "main" java.lang.ArithmeticException: Yritetään jakaa 0: lla kohdassa Main.divideByZero (Main.java:3) kohdassa Main.main (Main.java:7) poistumistila 1
Tässä esimerkissä heitämme nimenomaisesti ArithmeticException.
Huomaa: ArithmeticException on tarkistamaton poikkeus. Tarkastamattomia poikkeuksia ei yleensä tarvitse käsitellä.
Esimerkki 3: Heitetty tarkistettu poikkeus
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Tuotos
Tiedostoa ei löytynyt
findFile()Menetelmä heittää IOExceptionviestin ohitimme sen rakentajan.
Huomaa, että koska se on tarkistettu poikkeus, meidän on määritettävä se throwslausekkeessa.
Menetelmien, jotka kutsuvat tätä findFile()menetelmää, on joko käsiteltävä tätä poikkeusta tai määriteltävä se throwsitse käyttämällä avainsanaa.
Olemme käsitelleet tätä poikkeusta main()menetelmässä. Ohjelman suorituksen kulku siirtyy trylohkosta catchlohkoon, kun poikkeus heitetään. Joten loput koodista trylohkossa ohitetaan ja lauseen lauseet catchsuoritetaan.








