Java 中的异常处理

Java 中的异常是什么?

Java 中的异常是一种中断程序指令执行并扰乱程序正常执行流程的事件。它是一个对象,封装了在方法中发生的错误事件信息,并传递给运行时系统。在 Java 中,异常主要用于指示不同类型的错误条件。

有两种错误

  1. 编译时错误
  2. 运行时错误

编译时错误可进一步分为两种类型

  • 语法错误
  • 语义错误

语法错误示例

您本应声明 int a;,却错误地声明为 in a;,编译器将为此抛出错误。

示例:您声明了一个变量 int a;,并在代码的某些行之后再次声明一个整数 int a;。所有这些错误在编译代码时都会被高亮显示。

运行时错误示例

运行时错误称为异常错误。它是任何中断程序正常执行流程的事件。异常的例子包括算术异常、NullPointerException、除零异常等。Java 中的异常是开发人员无法控制的事情。

如果视频无法访问,请点击此处

我们为什么需要异常?

假设您编写了一个访问服务器的程序。在开发代码时一切正常。

Java Exception Handling

在实际生产运行时,服务器已关闭。当您的程序尝试访问它时,会引发一个异常。

Java Exception Handling

如何处理异常

到目前为止,我们已经看到异常是开发人员无法控制的。但将代码失败归咎于环境问题并不是解决方案。您需要健壮的编程,能够处理异常情况。这样的代码称为异常处理器

在我们的示例中,良好的异常处理方式是,当服务器关闭时,连接到备用服务器。

Java Exception Handling

要实现这一点,请键入连接服务器的代码(使用传统的 if 和 else 条件)。您将检查服务器是否关闭。如果是,则编写连接到备用服务器的代码。当代码有多个 Java 异常需要处理时,这种代码组织方式,使用“if”和“else”循环,效率不高。

class connect{
	if(Server Up){
	 // code to connect to server
	}
	else{
	 // code to connect to BACKUP server
	}
}

Try Catch 块

Java 提供了内置的异常处理机制。

  1. 正常代码放入 TRY 块。
  2. 异常处理代码放入 CATCH 块。

Try Catch Block

在我们的示例中,TRY 块将包含连接服务器的代码。CATCH 块将包含连接备用服务器的代码。如果服务器在线,将忽略 CATCH 块中的代码。如果服务器离线,则会引发异常,并执行 catch 块中的代码。

Try Catch Block

因此,这就是 Java 中处理异常的方式。

使用 try & catch 的语法

try{
    statement(s)
}
catch (exceptiontype name){
	statement(s)
}

示例

第 1 步: 将以下代码复制到编辑器中

class JavaException {
   public static void main(String args[]){
      int d = 0;
      int n = 20;
      int fraction = n/d;
     System.out.println("End Of Main");
   }
}

第 2 步: 保存文件并编译代码。使用命令 java JavaException 运行程序

第 3 步: 如下所示,第 5 行显示了算术异常 - 除以零,并且第 6 行永远不会执行

第 4 步: 现在让我们检查 try 和 catch 如何帮助我们处理此异常。我们将把导致代码行的异常放入一个 try 块,然后跟一个 catch 块。将以下代码复制到编辑器中。

class JavaException {
 public static void main(String args[]) {
  int d = 0;
  int n = 20;
  try {
   int fraction = n / d;
   System.out.println("This line will not be Executed");
  } catch (ArithmeticException e) {
   System.out.println("In the catch Block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

第 5 步: 保存、编译并运行代码。您将获得以下输出

Try Catch Block

正如您所观察到的,异常已被处理,并且最后一行代码也已执行。另外,请注意第 7 行不会执行,因为一旦引发异常,控制流就会跳转到 catch 块。

注意: 算术异常对象“e”包含有关发生的异常的信息,这对于采取恢复措施很有用。

Java 异常类继承结构

一个 catch 语句执行后,其他语句将被绕过,执行将继续在 try/catch 块之后。嵌套的 catch 块遵循异常层次结构。


Java Exception Hierarchy

  • Java 中的所有异常类都继承自‘Throwable’类。Throwable 有两个子类:Error 和 Exception
  • Error 类定义了程序在正常情况下不应发生的异常或问题,例如内存错误、硬件错误、JVM 错误等。
  • Exception 类表示可由我们的程序处理的异常,并且我们的程序可以使用 try 和 catch 块从该异常中恢复。
  • 运行时异常是 Exception 类的子类。这些类型的异常表示在运行时发生且无法在编译时跟踪的异常。一个很好的例子是除零异常或空指针异常等。
  • IO 异常是在输入输出操作期间生成的。
  • Java 中的中断异常是在多线程期间生成的。

示例: 了解 try 和 catch 块的嵌套

步骤 1) 将以下代码复制到编辑器中。

class JavaException {
 public static void main(String args[]) {
  try {
   int d = 1;
   int n = 20;
   int fraction = n / d;
   int g[] = {
    1
   };
   g[20] = 100;
  }
  /*catch(Exception e){
  	System.out.println("In the catch block due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch block due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

第 2 步: 保存文件并编译代码。使用命令 java JavaException 运行程序。

第 3 步: 生成 ArrayIndexOutOfBoundsException。将 int d 的值更改为 0。保存、编译并运行代码。

第 4 步: 必须生成 ArithmeticException。

第 5 步: 取消注释第 10 行到第 12 行。保存、编译并运行代码。

第 6 步: 编译错误? 这是因为 Exception 是 ArithmeticException 的基类。由 ArithmeticException 引发的任何异常也可以由 Exception 类处理。因此,ArithmeticException 的 catch 块永远不会有机会执行,这使其变得多余。因此会导致编译错误。

Java Finally 块

finally 块无论 try 块中是否引发异常都会执行。与 try 块一起使用是可选的

 try {
  statement(s)
 } catch (ExceptiontType name) {

  statement(s)

 } finally {

  statement(s)

 }

如果 try 块中引发了异常,则 finally 块将在 catch 块执行后执行。

示例

步骤 1) 将以下代码复制到编辑器中。

class JavaException {
   public static void main(String args[]){
    try{
       int d = 0;
       int n =20;
       int fraction = n/d;
    }
  catch(ArithmeticException e){
    System.out.println("In the catch block due to Exception = "+e);
  }
  finally{
	System.out.println("Inside the finally block");
  }
}
}

第 2 步: 保存、编译并运行代码。

第 3 步: 预期输出。即使引发了异常,Finally 块也会执行。

第 4 步: 将变量 d 的值更改为 1。保存、编译并运行代码,并观察输出。底部为表单

摘要

  • 异常是在运行时错误,它会中断程序的正常执行流程。程序执行期间的中断称为错误或异常。
  • 错误分为两类
    • 编译时错误 – 语法错误、语义错误
    • 运行时错误 – 异常
  • 健壮的程序应处理所有异常并继续其正常的程序执行流程。Java 提供了一种内置的异常处理方法。
  • 异常处理器是一组用于处理异常的代码。Java 中可以使用 try & catch 来处理异常。
  • Try 块:正常代码放入此块。
  • Catch 块:如果正常代码有错误,则会进入此块。