Java 异常处理

什么是例外?

异常是一个中断正常执行流程的事件。这是 Java 程序执行期间的中断。

在本教程中,你将学习 -

  • 什么是例外?
  • 为什么我们需要例外?
  • 如何处理例外
  • try...catch
  • Java 异常类层次结构
  • Java Finally Block

有两种类型的错误:

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

编译时错误可以再次分类为两种类型:

  • 语法错误
  • 语义错误

语法错误示例:

假如你不是用 int a;,而是错误地用 in a;,那么编译器会抛出错误。

示例:你已声明变量 int a; 并在一些代码行之后再次将整数声明为 int a;。编译代码时会突出显示所有这些错误。

运行时错误示例

运行时错误称为异常错误。任何事件都会中断正常的程序执行流程。

例外的例子有,算术异常,Nullpointer 异常,除零异常等。

Java 中的异常是开发人员无法控制的。

为什么我们需要 Exception?

假设你已编写了一个程序来访问服务器。在开发代码时,工作正常。

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

如何处理异常

到目前为止,我们已经看到,异常超出了开发人员的控制范围。但是将代码失败归咎于环境问题并不是解决方案。你需要一个强大的编程,它可以处理异常情况。这样的代码称为异常处理程序。

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

要实现此功能,请输入你的代码以连接到服务器(使用传统的 if 和 else 条件)。

你将检查服务器是否已关闭。如果是,请编写代码以连接到备份服务器。

当你的代码有多个 java 异常要处理时,使用 ifelse 循环的这种代码组织无效。

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

try...catch 语法

Java 提供内置的特殊处理。

  1. 正常代码进入 try 块。
  2. 异常处理代码进入 catch
class connect {
	try {
		// code to connect to the server
	}
	
	catch {
		// code to connect ot backup server
	}
}		

在我们的示例中,try 块将包含连接到服务器的代码。 catch 块将包含连接到备份服务器的代码。

如果服务器已启动,将忽略 catch 块中的代码。如果服务器关闭,则会引发异常,并且将执行 catch 块中的代码。

所以,这就是 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: 保存、编译和运行代码。你将获得以下输出

C:\workspace\java JavaException
In the catch clock due to Exception = java.lang.ArithmeticException: / by zero
End of main

如你所见,处理异常,并执行最后一行代码。另请注意,Line #7 将不会被执行,因为一旦异常被引发,控制流就会跳转到 catch 块。

注意: AritmeticException 对象 e 包含有关已发生的异常的信息,该异常可用于执行恢复操作。

Java 异常类层次结构

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

Java 异常层次结构指南

  • Java 中的所有异常类都扩展了类 Throwable。Throwable 有两个子类,Error 和 Exception
  • Error 类定义了我们的程序在正常情况下不会发生的异常或问题,例如内存错误、硬件错误、JVM 错误等
  • Exception 类表示我们的程序可以处理的异常,我们的程序可以使用 try 和 catch 块从这个异常中恢复
  • 运行时异常是异常类的子类。这些类型的异常表示在运行时发生的异常,并且在编译时无法跟踪。一个很好的例子是除零异常,或空指针异常等
  • 在输入和输出操作期间生成 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 clock due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch clock due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch clock due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

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

步骤 3: 生成 ArrayIndexOutOfBoundsException。将整数 d 的值更改为 0.保存,编译并运行代码。

步骤 4 生成了 ArithmeticException

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

步骤 6 编译错误?这是因为 Exception 是 ArithmeticException 异常的基类。ArithmeticException 引发的任何 Exception 都可以由 Exception 类处理。因此,ArithmeticException 的 catch 块永远不会被执行,这使得它变得多余。因此编译错误。

Java finally 语句

无论 try 块中出现异常,都会执行 finally 语句。finallytry 语句的可选项。

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

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

步骤 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 clock due to Exception = "+e);
  }
  finally{
    System.out.println("Inside the finally block");
  }
}
}

步骤 2: 保存、编译和运行代码。

步骤 3: 预期输出。最后,即使引发异常,也会执行块。

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

摘要

  • 异常是运行时错误,它会中断程序执行的正常流程。执行程序期间的中断称为错误或异常。
  • 错误分为两类
  • 编译时间错误 - 语法错误,语义错误
  • 运行时错误 - 异常
  • 一个强大的程序应该处理所有异常并继续其正常的程序执行流程。Java 提供了一种内置的特殊处理方法
  • 异常处理程序是一组处理异常的代码。可以使用 try&catch 在 Java 中处理异常。
  • try 语句:正常代码在此块上。
  • catch 语句:如果正常代码中有错误,那么它将进入此块