I den här handledningen lär vi oss att använda kasta och kasta nyckelord för undantagshantering med hjälp av exempel.
I Java kan undantag delas in i två typer:
- Okontrollerade Undantag: De är inte kontrolleras vid kompileringen tid men run-tid.Mer exempel:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, undantag enligtError
klass, etc. - Kontrollerade undantag: De kontrolleras vid sammanställningstid. Till exempel
IOException
,,InterruptedException
etc.
Se Java-undantag för att lära dig mer i detalj om markerade och okontrollerade undantag.
Vanligtvis behöver vi inte hantera okontrollerade undantag. Det beror på att okontrollerade undantag uppstår på grund av programmeringsfel. Och det är bra att korrigera dem istället för att hantera dem.
Denna handledning kommer nu att fokusera på hur man hanterar kontrollerade undantag med throw
och throws
.
Java kastar nyckelord
Vi använder throws
nyckelordet i metoddeklarationen för att deklarera vilken typ av undantag som kan förekomma inom det.
Dess syntax är:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Som du kan se från ovanstående syntax kan vi använda för throws
att förklara flera undantag.
Exempel 1: Java kastar nyckelord
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); ) ) )
Produktion
java.io.FileNotFoundException: test.txt (Ingen sådan fil eller katalog)
När vi kör det här programmet, om filen test.txt
inte finns, FileInputStream
kastar en FileNotFoundException
som utökar IOException
klassen.
Om en metod inte hanterar undantag måste typen av undantag som kan förekomma inom den specificeras i throws
paragrafen så att metoder längre upp i samtalsstacken kan hantera dem eller specificera dem med hjälp av throws
nyckelordet själva.
Den findFile()
metod anger att en IOException
kan kastas. Den main()
metodanrop denna metod och hanterar undantag om det kastas.
Kasta flera undantag
Så här kan vi kasta flera undantag med hjälp av throws
nyckelordet.
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()); ) ) )
Här findFile()
anger metoden att det kan kasta NullPointerException
, IOException
och InvalidClassException
i dess throws
klausul.
Observera att vi inte har hanterat NullPointerException
. Detta beror på att det är ett okontrollerat undantag. Det är inte nödvändigt att specificera det i throws
klausulen och hantera det.
kastar nyckelord Vs. försök … fånga … äntligen
Det kan finnas flera metoder som kan orsaka undantag. Att skriva try… catch
för varje metod blir tråkigt och koden blir lång och mindre läsbar.
throws
är också användbart när du har markerat undantag (ett undantag som måste hanteras) som du inte vill fånga i din nuvarande metod.
Sökord för Java-kast
Det throw
nyckelordet används för att explicit kasta ett enda undantag.
När ett undantag kastas överförs flödet av programkörning från try
blocket till catch
blocket. Vi använder throw
nyckelordet inom en metod.
Dess syntax är:
throw throwableObject;
Ett kastbart objekt är en förekomst av klass Throwable
eller underklass av Throwable
klassen.
Exempel 2: Java-sökord
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Produktion
Undantag i tråden "main" java.lang.ArithmeticException: Försöker dela med 0 vid Main.divideByZero (Main.java:3) vid Main.main (Main.java:7) exit status 1
I det här exemplet kastar vi uttryckligen en ArithmeticException.
Obs: ArithmeticException
är ett okontrollerat undantag. Det är vanligtvis inte nödvändigt att hantera okontrollerade undantag.
Exempel 3: Kasta kontrollerat undantag
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()); ) ) )
Produktion
Filen hittades inte
Den findFile()
metod kastar ett IOException
med det budskap vi vidare till dess konstruktör.
Observera att eftersom det är ett markerat undantag måste vi specificera det i throws
klausulen.
Metoderna som kallar den här findFile()
metoden måste antingen hantera detta undantag eller ange det med hjälp av throws
sökordet själva.
Vi har hanterat detta undantag i main
()
metoden. Flödet av programkörning överförs från try
block till catch
block när ett undantag kastas. Så, resten av koden i try
blocket hoppas över och uttalanden i catch
blocket körs.