Pour ceux qui viennent de commencer à apprendre la programmation, y compris le langage Java, et ceux qui l'ont déjà appris, pour examen Cette fois, j'écris pour en savoir plus sur la ** gestion des exceptions **.
S'il y a une erreur grammaticale dans le code source, une erreur sera générée au moment de la compilation et elle ne peut pas être exécutée, vous pouvez donc corriger l'erreur grammaticale ou l'erreur.
Cependant, une erreur qui n'est pas connue au moment de la compilation mais qui est remarquée après l'exécution est appelée une exception.
-Problème dans l'environnement d'exécution ou dans des situations qui ne peuvent pas être traitées par le programme ** Erreur ** ・ Exclusions pouvant être traitées par le programme
Afin d'éviter le comportement inattendu (exception) mentionné ci-dessus, le traitement correspondant est appelé ** traitement d'exception **.
・ Erreur ← jetable, super classe d'exception (classe parent)
Sous-classes (classes enfants) de la classe Throwable ・ ** Classe d'erreur ** ・ ** Exception **
Sous-classes (classes enfants) de la classe Exception ・ ** Classe RuntimeException ** ・ ** Autres classes **
La classe RuntimeException a également des sous-classes (classes enfants).
try-catch Commençons par écrire le code normalement.
Main.java
class Error {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
//Extrayez le tableau de fruits un par un, mais essayez d'accéder à l'extérieur des éléments du tableau
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
System.out.println("Afficher tous les fruits");
}
}
Résultat de sortie
pomme
banane
Mandarine
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.main(Main.java:6)
Il était affiché comme ci-dessus. Le dernier "Afficher tous les fruits" n'est pas sorti et le programme se termine au milieu.
Ensuite, modifions le code ci-dessus à l'aide de l'instruction try-catch.
Dans le bloc try
, décrivez la partie où l'exception est susceptible de se produire.
Écrivez catch (nom de la variable de nom de classe d'exception)
et
Dans le bloc catch
, décrivez le traitement lorsqu'une exception se produit.
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
try {
//Traitement susceptible de provoquer une exception
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
} catch(ArrayIndexOutOfBoundsException e) {
//Que faire lorsqu'une exception se produit
System.out.println("Une exception s'est produite");
}
System.out.println("Afficher tous les fruits");
}
}
Quand tu cours
Résultat de sortie
pomme
banane
Mandarine
Une exception s'est produite
Afficher tous les fruits
C'était sortie comme ci-dessus. Une exception s'est produite dans la quatrième boucle et le traitement à l'intérieur du bloc catch est en cours d'exécution. Et, le programme est sorti jusqu'au dernier "afficher tous les fruits" sans se terminer au milieu.
finally
Dans le bloc final
, décrivez le processus que vous souhaitez exécuter, qu'une exception se produise ou non.
Si aucune exception ne se produit (accès à l'intérieur d'un élément du tableau)
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
try {
//Traitement susceptible de provoquer une exception
for(int i = 0; i < 3; i++) {
System.out.println(fruits[i]);
}
} catch(ArrayIndexOutOfBoundsException e) {
//Que faire lorsqu'une exception se produit
System.out.println("Une exception s'est produite");
} finally {
//Toujours exécuté avec ou sans exceptions
System.out.println("Assurez-vous de traiter");
}
System.out.println("Afficher tous les fruits");
}
}
Quand tu cours
Résultat de sortie
pomme
banane
Mandarine
Assurez-vous de traiter
Afficher tous les fruits
Le traitement dans le bloc finally est exécuté comme décrit ci-dessus.
La prochaine fois qu'une exception se produit (accès en dehors des éléments du tableau)
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
try {
//Traitement susceptible de provoquer une exception
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
} catch(ArrayIndexOutOfBoundsException e) {
//Que faire lorsqu'une exception se produit
System.out.println("Une exception s'est produite");
} finally {
//Toujours exécuté avec ou sans exceptions
System.out.println("Assurez-vous de traiter");
}
System.out.println("Afficher tous les fruits");
}
}
Quand tu cours
Résultat de sortie
pomme
banane
Mandarine
Une exception s'est produite
Assurez-vous de traiter
Afficher tous les fruits
C'était sortie comme ci-dessus. Une exception est levée et le traitement à l'intérieur du bloc catch est exécuté. Ensuite, le traitement dans le bloc finally est exécuté, et la sortie est jusqu'au dernier "afficher tous les fruits".
En tant que combinaison de style d'écriture, comme ci-dessus ・ Try-catch ・ Essayez-enfin ・ Essayez-attrapez-enfin Est OK!
La méthode d'écriture suivante entraînera une erreur de compilation.
・ Essayez le bloc uniquement
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
//Seuls les blocs d'essai sont des erreurs de compilation
try {
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
}
System.out.println("Afficher tous les fruits");
}
}
・ Essayer-enfin-attraper, attraper-enfin-essayer
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
// try-finally-catch est une erreur de compilation
try {
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
} finally {
System.out.println("Assurez-vous de traiter");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Une exception s'est produite");
}
// catch-finally-essayez également de compiler l'erreur
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Une exception s'est produite");
} try {
for(int i = 0; i < 4; i++) {
System.out.println(fruits[i]);
}
} finally {
System.out.println("Assurez-vous de traiter");
}
}
}
J'ai appris à gérer les exceptions avec des blocs try-catch-finally, Voyons ici les types d'exceptions et apprenons quand les utiliser réellement.
** Exception non cochée ** Une exception dans laquelle le compilateur ne vérifie pas si la gestion des exceptions est décrite (la description du traitement des exceptions est facultative) La cible est la classe RuntimeException et ci-dessous.
Comme la gestion des exceptions est arbitraire, il n'y a aucun problème avec la syntaxe java elle-même et elle peut être compilée.
Main.java
class Main {
public static void main(String[] args) {
int[] num = {10, 20, 30};
System.out.println(num[3]); //Tentative de sortie en dehors de la plage du tableau num
}
}
Lorsque vous compilez et exécutez le fichier ci-dessus
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.main(Main9.java:71)
Je reçois une exception pour ArrayIndexOutOfBoundsException, une sous-classe de RuntimeException. L'exception est lorsque l'index (indice) du tableau est hors de portée.
Normalement, la gestion des exceptions n'est pas effectuée car de telles exceptions peuvent être évitées par la vérification du programmeur au moment du codage. (Si vous écrivez la gestion des exceptions dans tous les endroits où des exceptions sont susceptibles de se produire, ce sera du code compliqué)
Mais pour le moment, je vais le mettre dans une déclaration try-catch.
Main.java
class Main {
public static void main(String[] args) {
String[] fruits = {"pomme", "banane", "Mandarine"};
int[] num = {10, 20, 30};
try {
System.out.println(num[3]); //Tentative de sortie en dehors de la plage du tableau num
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Une exception s'est produite");
}
}
}
Lorsque vous compilez et exécutez
Une exception s'est produite
Le traitement dans l'instruction catch est en cours d'exécution.
** Exception d'inspection ** Une exception dans laquelle le compilateur vérifie si la gestion des exceptions a été décrite (la gestion des exceptions doit être décrite). D'autres classes autres que RuntimeException sont ciblées.
Une description de la gestion des exceptions est obligatoire, sinon une erreur se produira lors de la compilation. Nous allons jeter un coup d'oeil.
Lorsqu'il n'y a pas de description de la gestion des exceptions.
Main.java
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
class Main {
public static void main(String[] args) {
//Spécifiez le chemin du fichier
File file = new File("test.text");
//Obtenez une ligne dans le contenu du fichier
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str = bufferedReader.readLine();
//Tournez la boucle et affichez ligne par ligne
while(str != null){
System.out.println(str);
str = bufferedReader.readLine();
}
//Fermez enfin le fichier pour libérer des ressources
bufferedReader.close();
}
}
Lorsque vous compilez ceci,
Main.java:13:Erreur:L'exception FileNotFoundException n'est pas signalée. Doit être capturé ou déclaré lancer
FileReader fileReader = new FileReader(file);
^
Main.java:15:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
String str = bufferedReader.readLine();
^
Main.java:20:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
str = bufferedReader.readLine();
^
Main.java:24:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
bufferedReader.close();
^
4 erreurs
Si vous compilez sans décrire la gestion des exceptions, une erreur de compilation se produira.
Ensuite, placez-le dans une instruction try-catch.
Main.java
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
class Main {
public static void main(String[] args) {
// try-Lorsque la gestion des exceptions de catch est décrite
try {
//Spécifiez le chemin du fichier
File file = new File("test.text");
//Obtenez une ligne dans le contenu du fichier
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str = bufferedReader.readLine();
//Tournez la boucle et affichez ligne par ligne
while(str != null){
System.out.println(str);
str = bufferedReader.readLine();
}
//Fermez enfin le fichier pour libérer des ressources
bufferedReader.close();
} catch (IOException e) {
System.out.println("Une exception s'est produite");
}
}
}
Lorsque je compile, je n'obtiens pas d'erreur de compilation. Quand tu cours
AIUEO
Kakikukeko
SA Shi Su Se So
Et le contenu du fichier test.txt est sorti.
Cette fois, je fais intentionnellement une erreur dans la partie spécification de chemin du fichier.
Main.java
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
class Main {
public static void main(String[] args) {
// try-Lorsque la gestion des exceptions de catch est décrite
try {
//Spécifiez le chemin du fichier
File file = new File("aaaaaaaaa.text"); //Spécifiez un fichier texte qui n'existe pas
//Obtenez une ligne dans le contenu du fichier
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str = bufferedReader.readLine();
//Tournez la boucle et affichez ligne par ligne
while(str != null){
System.out.println(str);
str = bufferedReader.readLine();
}
//Fermez enfin le fichier pour libérer des ressources
bufferedReader.close();
} catch (IOException e) {
System.out.println("Une exception s'est produite");
}
}
}
Vous pouvez compiler. Quand je l'exécute,
Une exception s'est produite
A été sortie. Une exception s'est produite et le traitement dans l'instruction catch est en cours d'exécution.
Dans le cas d'autres classes autres que RuntimeException comme décrit ci-dessus, vous devez être conscient qu'il existe des cas où une erreur de compilation se produit si la gestion des exceptions n'est pas décrite.
②throws
En plus de la gestion des exceptions de bloc try-catch-block, vous pouvez également gérer les exceptions à l'aide du mot clé throws.
Ce mot clé est utilisé lors de la définition d'une méthode qui peut déclencher une exception. En spécifiant «lève le nom de la classe d'exception qui se produit» Le mécanisme est tel que l'exception est transmise à l'appelant de cette méthode.
Plus précisément, je vais essayer d'en faire une méthode basée sur l'exemple de code ci-dessus.
Définissez l'opération de lecture et de sortie du fichier en tant que méthode dans une autre classe.
Utilisez le throws keyword
lors de la définition de cette méthode.
GetText.java
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
class GetText {
//La méthode spécifiée par throws lève l'exception à l'appelant
public void getText() throws IOException {
//Spécifiez le chemin du fichier
File file = new File("aaaaaaaaa.text"); //Spécifiez un fichier texte qui n'existe pas
//Obtenez une ligne dans le contenu du fichier
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str = bufferedReader.readLine();
//Tournez la boucle et affichez ligne par ligne
while(str != null){
System.out.println(str);
str = bufferedReader.readLine();
}
//Fermez enfin le fichier pour libérer des ressources
bufferedReader.close();
}
}
Lors de l'appel de la méthode getText dans Main.java, si une exception se produit, l'instruction catch décrite ici sera traitée.
Main.java
import java.io.IOException;
class Main {
public static void main(String[] args) {
//Au moment des lancers
try {
GetText gt = new GetText();
//Appelez la méthode getText à l'aide du mot clé throws
gt.getText();
//Attrapez l'exception
} catch (IOException e) {
System.out.println("Une exception s'est produite");
}
}
}
Si vous compilez ce fichier, vous pouvez le compiler. Exécutez-le simplement
Une exception s'est produite
J'ai une exception pour accéder à un fichier qui n'existe pas dans getText. Cependant, il n'y a pas de description de l'instruction try-catch dans la méthode de traitement.
En déclarant le nom de classe d'exception qui provoque throws
lors de la définition de la méthode,
Une exception est levée (levée) dans l'instruction catch à l'appelant de cette méthode et la gestion des exceptions est effectuée.
Au fait, essayez d'éliminer l'instruction try-catch au niveau de l'appelant de la méthode,
Main.java
import java.io.IOException;
class Main {
public static void main(String[] args) {
//Au moment des lancers, essayez-Lorsque l'instruction catch est supprimée
GetText gt = new GetText();
gt.getText();
}
}
Lorsque vous compilez ...
Main.java:16:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
gt.getText();
^
1 erreur
J'obtiens une erreur de compilation. Notez que même si vous définissez une méthode qui utilise le mot clé throws, une erreur de compilation se produira si l'appelant de la méthode ne décrit pas la gestion des exceptions à l'aide de l'instruction try-catch.
③throw
Vous pouvez explicitement lancer une exception dans votre programme en utilisant le throw keyword
.
Contrairement à throws, lance des captures lorsqu'une exception se produit, mais renvoie explicitement une exception.
Par conséquent, vous pouvez intentionnellement déclencher vous-même une exception.
Main.java
class Main {
public static void main(String[] args) {
int[] num = {10, 20, 30};
try {
for(int i = 0; i < num.length; i++) {
System.out.println(num[i]);
if(num[i] < 20) {
//Lancement explicite d'une exception
throw new Exception();
}
}
} catch (Exception e) {
System.out.println("Une exception s'est produite");
}
}
}
Si vous compilez et exécutez avec le code ci-dessus,
10
Une exception s'est produite
Lors de la sortie de nombre de tableaux un par un, il est explicitement fait pour déclencher une exception quand elle dépasse 20. En conséquence, lors de la tentative de sortie du second 20, le traitement dans la capture est en cours d'exécution.
Le mot clé throw est différent du mot clé throws en ce sens que vous pouvez lever une exception n'importe où.
Si vous ne faites pas d'erreur dans la syntaxe Java, vous pouvez la compiler. J'ai appris la gestion des exceptions au cas où le processus s'arrêterait pendant l'exécution du programme.
Je veux être prudent car il existe des exceptions vérifiées qui nécessitent la description de la gestion des exceptions dans try-catch.
Je n'ai que des connaissances superficielles, je voudrais donc creuser plus profondément et comprendre qu'elles peuvent être utilisées dans la pratique.
Recommended Posts