Heim  >  Artikel  >  Java  >  Umfassendes Verständnis des Ausnahmebehandlungsmechanismus in Java

Umfassendes Verständnis des Ausnahmebehandlungsmechanismus in Java

高洛峰
高洛峰Original
2017-01-05 14:55:241234Durchsuche

1. Zusammenfassung der Java-Ausnahmen:

Ausnahmen sind abnormale Betriebsbedingungen, wenn das Programm ausgeführt wird

1. Ursprung der Ausnahmen:

Reflexion über die Realität im Formular von Java-Klassen Die Beschreibung von Problemen in Dingen und in Objekten versiegelt

ist eigentlich die Objektdarstellung der von Java beschriebenen abnormalen Situation

2. Es gibt zwei Möglichkeiten, Probleme zu klassifizieren: Eine ist schwerwiegend Problem ist kein schwerwiegendes Problem

Bei schwerwiegenden Problemen verwendet Java die Error-Klasse, um es zu beschreiben

Für Fehler wird im Allgemeinen kein gezielter Code geschrieben, um damit umzugehen

Für Bei nicht schwerwiegenden Ausnahmen verwendet Java die Exception-Klasse zur Beschreibung

Ausnahmen können gezielt behandelt werden

3. Zu den häufigen Ausnahmen gehören: Array-Index-Ausnahme außerhalb der Grenzen, Nullzeiger-Ausnahme ...

4. Sowohl Fehler als auch Ausnahme haben einige gemeinsame Inhalte.

Zum Beispiel: Nachrichten über ungewöhnliche Situationen, Ursachen usw.

Throwable //Elternklasse (extrahiert aus der gleichen Gemeinsamkeit der folgenden beiden Klassen)

|--Error

|--Excption //Zwei Unterklassen (innerhalb von Many Probleme werden definiert (Ausnahmen treten auf)) /*Der Name der übergeordneten Klasse wird als Suffixname der Unterklasse verwendet*/

Instanz 1: Ausnahmebeispiel

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");
  }
}

Laufergebnis:

Ausnahme im Thread „main“ java.lang.ArithmeticException: / durch Null

bei Demo.div(ExceptionDemo.java:5)

bei ExceptionDemo.main( ExceptionDemo.java :15)

Aus den obigen Ergebnissen ist ersichtlich, dass in den Zeilen 5 und 15 Ausnahmen aufgetreten sind. Dies liegt am Divisionsmechanismus. Der Divisor kann derzeit nicht 0 sein , wird beim Ausführen eine Ausnahme ausgelöst.

Beispiel 2: Ausnahme aufgetreten. Beispiel 2, Speicherüberlauf

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];
  }
}

Ausführungsergebnis:

Ausnahme im Thread „main“ java.lang. OutOfMemoryError: Java-Heap-Speicherplatz
bei ExceptionDemo.main(ExceptionDemo.java:19)

java.lang.OutOfMemoryError: Stellt eine Speicherüberlaufausnahme dar

2. Ausnahmebehandlung:

Für die Ausnahmebehandlung stellt Java eindeutige Anweisungen zur Verarbeitung bereit.

Format

try

{

Code, der erkannt werden muss;

}

catch

{

  Code für die Behandlung von Ausnahmen; (Behandlungsmethode)

}

finally

{

Code, der definitiv ausgeführt wird; (Verarbeitungsmethode)

}

Beispiel 1: Try-Catch-Anweisung demonstrieren

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];*/
  }
}

Wird ausgeführt Ergebnis:

Der Divisor ist falsch

über

Ergebnisanalyse: Wenn das Programm ausgeführt wird und die Divisionsanweisung: return x/y ausgeführt wird, wird sie generiert Ausnahmeobjekt new AritchmeticException(), die try-Anweisung erfasst dieses Objekt mit den Parametern der Catch-Anweisung

Exception e =new AritchmeticException();

Nach dem Ausführen der Catch-Verarbeitungsanweisung ist das Problem Beenden Sie nach der Verarbeitung die Anweisung und geben Sie sie aus

Beispiel 2: Führen Sie allgemeine Methodenoperationen für das erfasste Ausnahmeobjekt aus (Methoden der übergeordneten Klasse Throwable)

String getMessage(); Ausnahmeinformationen

toString() //Ausnahmename zurückgeben: Ausnahmeinformationen

printStackTrace() //Ausnahmename, Ausnahmeinformationen, Ausnahmeort ausgeben

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];*/
  }
}

Ausführungsergebnis :

Falscher Divisor

/ durch Null
java.lang.ArithmeticException: / durch Null
java.lang.ArithmeticException: / durch Null

at Demo.div(ExceptionDemo.java:5)

at ExceptionDemo.main(ExceptionDemo.java:17)

über

Von der Bei der Analyse der laufenden Ergebnisse besteht der standardmäßige Ausnahmebehandlungsmechanismus von JVM darin, die Methode printStackTrace aufzurufen.

Beispiel 3: Zwei Möglichkeiten, ausgelöste Ausnahmen zu behandeln

1. Werfen Sie es zur Verarbeitung in die virtuelle JVM-Maschine

2. Behandeln Sie die ausgelöste Ausnahme selbst

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");    
  }
}

Ergebnis ausführen:

ExceptionDemo.java:15: Fehler: Nicht gemeldeter Ausnahmefehler. Ausnahme; es muss abgefangen oder deklariert werden, um
throw
int x=d .div(4,0 );
^

1 Fehler

Ergebnisanalyse: Dies liegt daran, dass mögliche Ausnahmen nicht behandelt werden

Verarbeitungsmethode 1: Weiterhin Ausnahmen auslösen und Lassen Sie die virtuelle JVM-Maschine es selbst behandeln

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");    
  }
}

Verarbeitungsmethode 2: Behandeln Sie die Ausnahme selbst

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");  
    }
  }
}

Zusammenfassung:

in der Funktion Exception wird deklariert über. Um die Sicherheit zu verbessern, lassen Sie das Callout die Verarbeitung übernehmen und nicht Kompilierungsfehler.

Beispiel 4: Behandlung mehrerer Ausnahmen

1 Bei der Deklaration einer Ausnahme wird empfohlen, eine spezifischere Ausnahme zu deklarieren, damit die Verarbeitung spezifischer sein kann

2 . Deklarieren Sie mehrere Ausnahmen, die mehreren Catch-Blöcken entsprechen. Definieren Sie keine redundanten Catch-Blöcke.

Wenn zwischen Ausnahmen in mehreren Catch-Blöcken eine Vererbungsbeziehung besteht, wird der Ausnahme-Catch-Block der übergeordneten Klasse darunter platziert.

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());
    }
  }
}

Ergebnis ausführen:

Das Array liegt außerhalb der Grenzen
java.lang.ArrayIndexOutOfBoundsException: 4

Vorschlag:

Einbauen Bei der Verarbeitung von Catch muss die spezifische Verarbeitungsmethode im Catch definiert werden

Definieren Sie nicht einfach e.printStackTrace().

Schreiben Sie nicht einfach eine Ausgabeanweisung

denn wenn Benutzer es nicht verstehen, ist es am besten, es in einer Datei zu speichern und sie regelmäßig zur Überprüfung an unsere Entwickler zu senden.

Beispiel 5: Benutzerdefinierte Ausnahme

Haben Sie bemerkt, dass die von uns verwendeten Ausnahmen alle in Java gekapselt sind?

Aber in der tatsächlichen Entwicklung unseres Programms Die Ausnahme, die in Java angezeigt wird darf nicht gekapselt sein

Zu diesem Zeitpunkt müssen Sie es selbst definieren

Basierend auf dem obigen Code habe ich definiert, dass der Teiler keine negative Zahl sein darf. Der Code lautet wie folgt 🎜>

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");
  }
}
Laufergebnis:

Der Nenner ist negativ ------/bu FuShu-3

über

从上面的结果,可以看出

在本程序中,对于除数是-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中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn