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
, poikkeustenError
luokka jne - Tarkistetut poikkeukset: Ne tarkistetaan kokoamisajankohtana. Esimerkiksi
IOException
,InterruptedException
jne
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ä throw
ja throws
.
Java heittää avainsanan
Käytämme throws
avainsanaa 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ää throws
useita 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.txt
ei ole, FileInputStream
heittää a, FileNotFoundException
joka laajentaa IOException
luokkaa.
Jos menetelmä ei käsittele poikkeuksia, siinä mahdollisesti esiintyvien poikkeusten tyyppi on määriteltävä throws
lausekkeessa, jotta puhelupinossa ylhäällä olevat menetelmät voivat käsitellä niitä tai määrittää ne throws
itse avainsanalla.
findFile()
Menetelmä määrittää, että IOException
voidaan heittää. main()
Metodikutsuja tätä menetelmää ja käsittelee poikkeus, jos se on heitetty.
Useiden poikkeusten heittäminen
Näin voimme heittää useita poikkeuksia throws
avainsanalla.
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
, IOException
ja InvalidClassException
sen throws
lauseke.
Huomaa, että emme ole käsitelleet NullPointerException
. Tämä johtuu siitä, että se on tarkistamaton poikkeus. Sitä ei tarvitse määrittää throws
lausekkeessa ja käsitellä sitä.
heittää avainsanan vs. yritä … kiinni … vihdoin
Poikkeuksia voi olla useita. try… catch
Kunkin 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
throw
Avainsanaa käytetään nimenomaan heittää yksi poikkeus.
Kun heitetään poikkeus, ohjelman suorituksen kulku siirtyy try
lohkosta catch
lohkoon. Käytämme throw
avainsanaa menetelmän sisällä.
Sen syntaksi on:
throw throwableObject;
Heitettävä esine on luokan Throwable
tai 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ää IOException
viestin ohitimme sen rakentajan.
Huomaa, että koska se on tarkistettu poikkeus, meidän on määritettävä se throws
lausekkeessa.
Menetelmien, jotka kutsuvat tätä findFile()
menetelmää, on joko käsiteltävä tätä poikkeusta tai määriteltävä se throws
itse käyttämällä avainsanaa.
Olemme käsitelleet tätä poikkeusta main
()
menetelmässä. Ohjelman suorituksen kulku siirtyy try
lohkosta catch
lohkoon, kun poikkeus heitetään. Joten loput koodista try
lohkossa ohitetaan ja lauseen lauseet catch
suoritetaan.