Maison  >  Article  >  Java  >  Compréhension complète du mécanisme de gestion des exceptions en Java

Compréhension complète du mécanisme de gestion des exceptions en Java

高洛峰
高洛峰original
2017-01-05 14:55:241234parcourir

1. Récapitulatif des exceptions Java :

Les exceptions sont des conditions de fonctionnement anormales lors de l'exécution du programme

1. Origine des exceptions :

Réflexion sur la réalité sous la forme. des classes Java La description des problèmes dans les choses et scellés dans les objets

est en fait la représentation objet des situations anormales décrites par Java

2. Il existe deux manières de classer les problèmes : l'une est sérieuse La le problème est un problème non grave

Pour les problèmes graves, Java utilise la classe Error pour le décrire

Pour l'erreur, généralement aucun code ciblé n'est écrit pour le gérer

Pour les exceptions non sérieuses, Java utilise la classe Exception pour décrire

Les exceptions peuvent être gérées de manière ciblée

3. Les exceptions courantes incluent : exception hors limites d'index de tableau, exception de pointeur nul ...

4. L'erreur et l'exception ont des contenus communs.

Par exemple : des actualités sur des situations anormales, des causes, etc.

Throwable //Classe parent (extraite du même point commun des deux classes suivantes)

|--Erreur

|--Excption //Deux sous-classes (à l'intérieur de Many les problèmes sont définis (des exceptions se produisent)) /*Le nom de la classe parent est utilisé comme nom de suffixe de la sous-classe*/

Instance 1 : Exemple d'exception

class Demo 
{
  public int div(int x,int y)
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])
  {
    Demo d=new Demo();
    int x=d.div(4,0);  //0作为除数
    System.out.println("x="+x);
    System.out.println("over");
  }
}

Résultat d'exécution :

Exception dans le fil de discussion "main" java.lang.ArithmeticException : / par zéro

à Demo.div(ExceptionDemo.java:5)

à ExceptionDemo.main( ExceptionDemo.java :15)

D'après les résultats ci-dessus, on peut voir que des exceptions se sont produites aux lignes 5 et 15. Cela est dû au mécanisme de division qui ne peut pas être 0. À l'heure actuelle. , une exception sera levée lors de l'exécution d'Exception.

Exemple 2 : une exception s'est produite Exemple 2, débordement de mémoire

class Demo
{
  public int div(int x,int y)
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])
  {
    /*Demo d=new Demo();
    int x=d.div(4,0);
    System.out.println("x="+x);
    System.out.println("over");
    */
    byte[] arr=new byte[1024*1024*1000];
  }
}

Résultat d'exécution :

Exception dans le thread "main" java.lang. OutOfMemoryError : espace de tas Java
at ExceptionDemo.main(ExceptionDemo.java:19)

java.lang.OutOfMemoryError : représente une exception de dépassement de mémoire

2. Gestion des exceptions :

Pour la gestion des exceptions, Java fournit des instructions uniques pour le traitement

Format

try

{

Code qui doit être détecté ;

}

catch

{

  Code de gestion des exceptions ; (méthode de gestion)

}

enfin

{

Code qui sera définitivement exécuté ; (méthode de traitement)

}

Exemple 1 : Démonstration de l'instruction try catch

class Demo
{
  public int div(int x,int y)
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])
  {
    Demo d=new Demo();
    try
    {
      int x=d.div(4,0);
      System.out.println("x="+x);
    }
    catch(Exception e)
    {
      System.out.println("除数有误");
    }
     
    System.out.println("over");
     
    /*byte[] arr=new byte[1024*1024*1000];*/
  }
}

En cours d'exécution résultat :

Le diviseur est erroné

sur

Analyse du résultat : Lorsque le programme est en cours d'exécution, lorsque l'instruction de division : return x/y est exécutée, elle est générée. objet d'exception new AritchmeticException(), l'instruction try capture cet objet avec les paramètres de l'instruction catch

Exception e =new AritchmeticException();

Après avoir exécuté l'instruction de traitement catch, le problème est Après le traitement, terminez l'instruction et affichez

Exemple 2 : Effectuer des opérations de méthode courantes sur l'objet d'exception capturé (méthodes de la classe parent Throwable)

String getMessage( //Obtenir le informations sur l'exception

toString() //Renvoie le nom de l'exception : informations sur l'exception

printStackTrace() //Sortie du nom de l'exception, des informations sur l'exception, de l'emplacement de l'exception

class Demo
{
  public int div(int x,int y)
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])
  {
    Demo d=new Demo();
    try
    {
      int x=d.div(4,0);
      System.out.println("x="+x);
    }
    catch(Exception e)
    {
      System.out.println("除数有误");
      //获得异常信息
      System.out.println(e.getMessage());
      //获得异常信息,异常名称
      System.out.println(e.toString());
      //输出异常名称,异常信息,异常出现的位置
      e.printStackTrace();         
    }
     
    System.out.println("over");
     
    /*byte[] arr=new byte[1024*1024*1000];*/
  }
}

Exécuter le résultat :

Diviseur incorrect

/ par zéro
java.lang.ArithmeticException : / par zéro
java.lang.ArithmeticException : / par zéro

à Demo.div(ExceptionDemo.java:5)

à ExceptionDemo.main(ExceptionDemo.java:17)

plus

Depuis le analyse des résultats en cours d'exécution, en fait, le mécanisme de gestion des exceptions par défaut de jvm consiste à appeler la méthode printStackTrace.

Exemple 3 : Deux façons de gérer les exceptions levées

1. Lancez-la sur la machine virtuelle JVM pour traitement

2. Gérez vous-même l'exception levée

class Demo
{
  public int div(int x,int y)throws Exception    /*有可能出现异常的地方抛出异常*/
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])
  {
    Demo d=new Demo();  
    int x=d.div(4,0);
    System.out.println("x="+x);    
    System.out.println("over");    
  }
}
Résultat d'exécution :

ExceptionDemo.java:15 : Erreur : Erreur d'exception non signalée Exception ; elle doit être interceptée ou déclarée pour

lancer
int x=d .div(4,0 );
^

1 erreur

Analyse des résultats : en effet, il n'y a pas de gestion des exceptions possibles

Méthode de gestion 1 : continuez à lancer des exceptions et laissez la machine virtuelle jvm le gérer elle-même

class Demo
{
  public int div(int x,int y)throws Exception    /*有可能出现异常的地方抛出异常*/
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])   throws Exception  /*继续抛出异常,给虚拟机*/
  {
    Demo d=new Demo();  
    int x=d.div(4,0);
    System.out.println("x="+x);    
    System.out.println("over");    
  }
}
Méthode de gestion 2 : Gérer les exceptions par vous-même

class Demo
{
  public int div(int x,int y)throws Exception    /*有可能出现异常的地方抛出异常*/
  {
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])   
  {
    Demo d=new Demo();
    try                   //自己处理异常
    {
      int x=d.div(4,0);
      System.out.println("x="+x);
    }
    catch(Exception e)
    {
      System.out.println("除数有误");
      //获得异常信息,异常名称
      System.out.println(e.toString());  
      System.out.println("over");  
    }
  }
}
Résumé :

dans la fonction L'exception est déclarée ci-dessus . Pour améliorer la sécurité, laissez l'appel gérer le traitement et non les échecs de compilation.

Exemple 4 : Gestion de plusieurs exceptions

1 Lors de la déclaration d'une exception, il est recommandé de déclarer une exception plus spécifique, afin que le traitement puisse être plus spécifique

2. . Déclarez plusieurs exceptions correspondant à plusieurs blocs catch. Ne définissez pas de blocs catch redondants.

S'il existe une relation d'héritage entre les exceptions dans plusieurs blocs catch, le bloc catch d'exception de la classe parent est placé en dessous.

class Demo
{
  public int div(int x,int y)throws ArithmeticException,ArrayIndexOutOfBoundsException    
  {
    int arr[]=new int [x];
    System.out.println(arr[4]);
    return x/y;
  }
}
 
 
class ExceptionDemo
{
  public static void main(String args[])   
  {
    Demo d=new Demo();
    try                  
    {
      int x=d.div(4,0);
      System.out.println("x="+x);
    }
    catch(ArithmeticException e)          /*除法法则异常对象接收,第一个执行*/
    {
      System.out.println("除数有误");
      //获得异常信息,异常名称
      System.out.println(e.toString());  
      System.out.println("over");  
    }
    catch(ArrayIndexOutOfBoundsException e)    /*数据越界的对象接收,第二个执行*/
    {
      System.out.println("数组越界了");
      //输出异常信息
      System.out.println(e.toString());
    }
    catch(Exception e)               /*父类Exception接收,最后执行,建议不要写这个,让程序终止*/ /*用到了多态*/
    {
      System.out.println(e.toString());
    }
  }
}
Résultat de l'opération :

Le tableau est hors limites

java.lang.ArrayIndexOutOfBoundsException : 4

Suggestion :

Construit lors de la gestion du catch, la méthode de traitement spécifique doit être définie dans le catch

Ne définissez pas simplement e.printStackTrace().

N'écrivez pas simplement une instruction de sortie

car si les utilisateurs ne peuvent pas le comprendre, il est préférable de l'enregistrer dans un fichier et de l'envoyer régulièrement à nos développeurs pour examen.

Exemple 5 : exception personnalisée

Avez-vous remarqué que les exceptions que nous utilisons sont toutes encapsulées en Java

Mais dans le développement réel, notre programme L'exception qui apparaît en Java peut ne pas être encapsulé.

Pour le moment, vous devez le définir vous-même

Sur la base du code ci-dessus, j'ai défini que le diviseur ne peut pas être un nombre négatif. Le code est le suivant. 🎜>

Résultat de l'exécution :
class Demo
{
  public int div(int x,int y)throws FuShuException  /*抛出异常*/  
  {
    if(y<0)
    {
      throw new FuShuException("分母出现负数了------/bu FuShu",y);  /*自己手动抛出异常的对象*/
    }
    return x/y;
  }
}
class FuShuException extends Exception
{
  private int value;
  FuShuException(String m,int value)
  {
    super(m);                  /*给父类Exception的getMessage方法传递参数*/
    this.value=value;
  }  
  public int getValue()              /*自定义的方法,返回负数*/
  {
    return value;
  }
}
 
class ExceptionDemo
{
  public static void main(String args[])   
  {
    Demo d=new Demo();
    try                              
    {
      int x=d.div(4,-3);
      System.out.println("x="+x);
    }
    catch(FuShuException e)          /*捕获异常对象*/
    {
      System.out.println(e.getMessage()+e.getValue());
    }
    System.out.println("over");
  }
}

Le dénominateur est négatif ------/bu FuShu-3

sur


从上面的结果,可以看出

在本程序中,对于除数是-3,也视为是错误的是无法进行运算的。

那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。

要么在内部try catch处理。

要么在函数上声明让调用者处理。

一般情况在,函数内出现异常,函数上需要声明。

发现打印的结果中只有异常的名称,却没有异常的信息。

因为自定义的异常并未定义信息。

如何定义异常信息呢?

因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。

自定义异常必须是自定义类继承Exception。

继承Exception原因:

异常体系有一个特点:因为异常类和异常对象都被抛出。

他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

只有这个体系中的类和对象才可以被throws和throw操作。

throws和throw的区别

throws使用在函数上。

throw使用在函数内。

throws后面跟的异常类。可以跟多个。用逗号隔开。

throw后跟的是异常对象。

实例6:Exception中有一个特殊的子类异常RuntimeException 运行时异常

如果在函数内容抛出该异常,函数上可以不声明,编译一样通过。

如果函数上声明了该异常,调用者可以不进行处理,编译一样通过

之所以不用在函数声明,是因为不需要让调用者处理

当该异常发生,希望程序停止,因为在运行时,出现了无法运行的情况,希望程序停止后

程序员对该代码进行修改。

class Demo
{
  public int div(int x,int y)throws FuShuException   /*抛不抛结果都一样*/
  {
    if(y<0)
    {
      throw new FuShuException("分母出现负数了------/bu FuShu",y);  
    }
    return x/y;
  }
}
class FuShuException extends RuntimeException     /*继承RuntimeException*/
{
  FuShuException(String m,int value)
  {
    super(m);                  
     
  }  
}
 
class ExceptionDemo
{
  public static void main(String args[])   
  {
    Demo d=new Demo();
    int x=d.div(4,-3);              /*运行到这会出现异常,编译没有问题*/
    System.out.println("x="+x);
    System.out.println("over");
  }
}

运行结果:

Exception in thread "main" FuShuException: 分母出现负数了------/bu FuShu
at Demo.div(ExceptionDemo.java:7)
at ExceptionDemo.main(ExceptionDemo.java:26)

从上面的结果可以看出:

自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。

对于异常分两种:

1,编译时被检测的异常。

2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类)

以上这篇全面理解java中的异常处理机制就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。

更多全面理解java中的异常处理机制相关文章请关注PHP中文网!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn