Video: Minecraft Skyblock #1 2024
Föreställ dig ett Java-program som får inmatning från två olika filer eller från en
Skanner
och en skiva fil. För att försäkra dig om att du rensar ordentligt, lägger du
nära
metodsamtal i en
äntligen
-klausul.
importera java. io. Fil;
importera java. io. IOException;
importera java. util. Scanner;
allmän klass Main {
statisk statisk tomt huvud (String args []) {
Scanner scan1 = null;
Scanner scan2 = null;
försök {
scan1 = ny skanner (ny fil ("File1. Txt"));
scan2 = ny skanner (ny fil ("File2. Txt"));
// Gör användbara saker
} fånga (IOException e) {
// Oj!
} äntligen {
scan1. stänga();
scan2. stänga();
System. ut. println ("Klart!");
}
}
}
I teorin exekverar datorn alltid
scan1. close ()
och
scan2. stäng ()
oavsett vad som går fel under körningen av
försöket
. Men det är teori. I själva verket kan en annan programmerare (inte självklart) ändra koden genom att stänga
scan1
i mitten av
försöket
:
försök {
scan1 = ny skanner (ny fil ("File1. Txt"));
scan2 = ny skanner (ny fil ("File2. Txt"));
// Gör användbara saker men också …
scan1. stänga();
scan1 = null;
} fångst (IOException e) {
// Oj!
} äntligen {
scan1. stänga();
scan2. stänga();
System. ut. println ("Klart!");
}
Nu har du ett verkligt problem. Inne i
äntligen
-klausulen är värdet
scan1
null
. Samtalet till
scan1. nära ()
misslyckas, så programmet slänger en
NullPointerException
och slutar köra innan samtalet går till
scan2. close ()
. I de värsta fallen är
scan2
inte stängd och ditt program har
File2. txt
låst så att inget annat program kan använda filen.
När ett program använder flera resurser (många filer, en databas och en fil, eller vad som helst) blir uppbyggnaden av
försök
uttalanden ganska komplicerade. Du kan göra
försök
uttalanden inom
fånga
klausuler och alla slags galen kombinationer. Men Java har ett bättre sätt att lösa problemet: I Java 7 (och senare versioner av Java) kan du skapa ett försök med resurser. Den här koden visar hur.
importera java. io. Fil;
importera java. io. IOException;
importera java. util. Scanner;
public class NewMain {
statisk statisk tomt huvud (String args []) {
försök (Scanner scan1 = new Scanner (ny fil ("File1.txt "));
Scanner scan2 = ny skanner (ny fil (" File2. txt "))) {
// Gör användbara saker
} fånga (IOException e) {
// Oops ! }
System. ut. println ("Done!");
}
}
I denna kod anges deklarationerna av
scan1
och
scan2
är i parentes efter ordet
försök
. De parentesiserade deklarationerna berättar att Java stänger
scan1
och
scan2
automatiskt efter utförandet av uttalandena i > försök
-klausulen. Du kan deklarera flera resurser inom ett
försök
uttalandets parentes. När du gör stänger Java alla resurser automatiskt efter utförandet av
försök
-klausulens uttalanden. Lägg till
fångst
klausuler och en
äntligen
-klausul, om du vill. Du kan komma åt alla typer av resurser (filer, databaser, anslutningar till servrar och andra) och ha lugn och ro att veta att Java kommer att separera anslutningarna automatiskt.
Livet är bra.