Java 程序处理异常方法

javaobject oriented programmingprogramming更新于 2024/8/5 17:24:00

异常是破坏程序正常执行流程的异常事件。发生异常时,会生成一个称为异常对象的对象,其中包含异常的详细信息,如名称、描述、程序状态。在本节中,我们将编写一个 Java 程序来处理 Java 中存在的不同异常方法。

异常类型

异常有三种类型 -

检查异常 - 检查异常是编译时异常,即在程序编译期间检查。这些异常不能被忽略,必须由程序员处理。示例:IOException、SQLException、ClassNotFounException。

未检查异常 - 未检查异常是运行时异常,即在编译期间被忽略,在程序执行期间检查。示例:NullPointerExceptions、ArthemeticException 和 ArrayIndexOutOfBoundException。

错误 - 错误是无法恢复的异常,通常由于 Java 虚拟机或系统资源中的问题而发生。错误与异常不同,错误不应被程序员捕获或处理,因为它们表明存在严重问题,并且程序无法修复。示例:OutOfMemoryError、StackOverflowError。

异常处理

异常处理是处理程序执行期间引发的异常的过程,以便执行流程不会中断。这是使用 Java 中的 try-catch 块完成的。Try 块包含可能引发异常的代码,catch 块包含处理异常的代码。

我们可以使用内置异常,也可以创建自定义或用户定义的异常。自定义异常扩展了 Exception 类或 RuntimeException 类。

Java 提供了许多方法来处理这些异常。其中一些方法是 −

getMessage() − 此方法用于以字符串形式返回错误消息。这是 Java 中 Throwable 类中定义的方法。

try {
   // 一些可能引发异常的代码
} catch (Exception e) {
   String message = e.getMessage();
   System.out.println("Exception occurred: " + message);

getStackTrace() − 此方法返回导致异常的方法调用序列数组。这是 Java 中 Throwable 类中定义的方法。

try {
   // 一些可能引发异常的代码
} catch (Exception e) {
   StackTraceElement[] st = e.getStackTrace();
   for (StackTraceElement ele : st) {
      System.out.println(ele.toString());
   }
}

printStackTrace() − 此方法打印导致异常的方法调用序列数组。这是 Java 中 Throwable 类中定义的方法。

try {
   // 一些可能引发异常的代码
} catch (Exception e) {
   e.printStackTrace();
}

Throw - 'throw' 是 Java 中用于明确抛出异常的关键字。执行此操作时,正常程序流程将停止并抛出异常,最近的 catch 将捕获此异常。

public void divide(int a, int b) {
   if (b == 0) {
      throw new ArithmeticException("Cannot divide by zero!"); // throws Arthemetic Exception
   }
   int result = a / b;
   System.out.println("Result: " + result);
}

getCause() − 此方法返回异常的原因,该异常可能是触发此异常的其他异常。如果原因未知,则返回"null"。这是 Java 中 Throwable 类中定义的方法。

try {
    // 一些可能引发异常的代码
} catch (Exception e) {
   Throwable cause = e.getCause();
   if (cause != null) {
      System.out.println("Cause: " + cause.toString());
   } else {
      System.out.println("No cause found.");
   }
}

语法

try-catch 块 − Java 中的 try - catch 块用于处理异常。try - 块包含可能引发异常的代码。catch 块捕获异常并处理异常。单个 try 后面可以跟一组 catch 块。

try {
    // Protected 代码
} catch (ExceptionName e1) {
    // Catch 块
}

现在,我们将详细讨论 Java 中处理方法中异常的不同方法。

方法 1:使用单个 try-catch 块

在这种方法中,我们将使用单个 try 和单个 catch 块处理发生的异常。

算法

  • 用随机值初始化数组。

  • 尝试访问数组中的元素,使得索引应大于数组的长度。在引发异常时,将此代码写入 try 块中。

  • 一旦发生异常,使用 catch() 方法捕获 ArrayIndexOutOfBounds 异常,并使用 getMessage() 方法打印消息,并使用 printStackTrace() 方法打印方法调用序列。

示例

在此示例中,我们在 try 和 catch 块中编写代码。在 try 块中,我们用 5 个值初始化一个数组,并访问数组的第 8 个元素,这通常会引发异常 "ArrayIndexOutOfBoundsException"。catch 块捕获此异常,我们使用 getMessage() 方法打印错误消息,并使用 printStackTrace() 方法打印异常发生期间的方法调用序列。

import java.util.*;
public class Main {
   public static void main(String[] args) {
      try {
         int[] arr = {1, 2, 3,4,5};
         System.out.println(arr[8]); 
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("An exception occurred: " + e.getMessage());
         e. printStackTrace() ;

      }
   }
}

输出

An exception occurred: Index 8 out of bounds for length 5
java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 5
        at Main.main(Main.java:6)

方法 2:使用单个 try - 多个 catch 块

在此方法中,我们将使用单个 try 和多个 catch 块处理发生的异常。

算法

  • 声明一个 try 块并初始化两个整数变量,即分子和分母。分母变量初始化为 0。

  • 现在,如果分母值等于零,则抛出 ArithmeticException。

  • 编写多个 catch 块来处理不同的异常。

  • 使用 java 中的不同内置方法并打印发生的异常消息和异常。

示例

在此示例中,我们使用单个 try 块,后跟多个 catch 块。如果 ArithmeticException 从 try 块中抛出,则执行处理 ArithmeticException 代码的 catch 块。如果 try 块抛出 NullPointerException,则执行该特定 catch 块。如果 catch 块不处理 try 块抛出的特定异常,则执行最后的 catch 块代码,因为它正在处理一般异常情况。从示例中,由于分母值初始化为零,我们使用"throw"关键字抛出 ArthemeticException,并且执行处理 ArthemeticException 的 catch 块。

import java.util.*;
public class Main {
   public static void main(String[] args) {
      try {
         int numerator = 10, denominator = 0 ;
         if(denominator == 0) {
            throw new ArithmeticException();
         }
      } catch (ArithmeticException e) {
         System.out.println("ArithmeticException caught.");
         System.out.println("Message: " + e.getMessage());
         System.out.println("Stack Trace: ");
         e.printStackTrace();
         System.out.println("Cause: " + e.getCause());
      } catch (NullPointerException e) {
         System.out.println("NullPointerException caught.");
         System.out.println("Message: " + e.getMessage());
         System.out.println("Stack Trace: ");
         e.printStackTrace();
         System.out.println("Cause: " + e.getCause());
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("ArrayIndexOutOfBoundsException caught.");
         System.out.println("Message: " + e.getMessage());
         System.out.println("Stack Trace: ");
         e.printStackTrace();
         System.out.println("Cause: " + e.getCause());
      }catch (Exception e) {
         System.out.println("NullPointerException caught.");
         System.out.println("Message: " + e.getMessage());
         System.out.println("Stack Trace: ");
         e.printStackTrace();
         System.out.println("Cause: " + e.getCause());
      }
   }
}

输出

ArithmeticException caught.
Message: null
Stack Trace: 
java.lang.ArithmeticException
        at Main.main(Main.java:7)
Cause: null

因此,在本文中,我们讨论了在 Java 编程语言中处理异常方法的不同方法。


相关文章