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