Java程序处理除零和多个异常


异常是指中断程序正常执行流程的异常事件。当发生异常时,会生成一个称为异常对象的物件,其中包含异常的详细信息,例如名称、描述和程序状态。在本节中,我们将编写一个java程序来处理除零异常以及如何处理多个异常。

异常类型

有三种类型的异常:

  • 检查异常 - 检查异常是编译时异常,即在程序编译期间检查。这些异常不能被忽略,必须由程序员处理。

示例 - IOException、SQLException、ClassNotFoundException。

  • 未检查异常 - 未检查异常是运行时异常,即在编译期间被忽略,在程序执行期间检查。

示例 - NullPointerException、ArithmeticException 和 ArrayIndexOutOfBoundsException

  • 错误 - 错误是无法恢复的异常,通常是由 Java 虚拟机或系统资源问题引起的。错误与异常不同,错误不应由程序员捕获或处理,因为它们表明存在严重问题,程序无法修复。

示例 - OutOfMemoryError、StackOverflowError。

Java中不同类型异常的示例

  • ArithmeticException - 当算术运算产生溢出或下溢,或除以零时引发。

  • NullPointerException - 当我们指向一个空对象时引发。

  • ArrayIndexOutOfBoundsException - 当我们尝试访问超出范围的索引时引发。

  • IOException - 当输入/输出操作失败时引发。

  • FileNotFoundException - 当尝试访问不存在的文件时引发。

异常处理

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

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

语法

try-catch 块 - Java 中的 try-catch 块用于处理异常。try 块包含可能引发异常的代码。catch 块捕获异常并处理异常。

try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

getMessage() - 此方法用于获取异常的详细描述作为字符串。

exceptionObject.getMessage()

throw - throw 是 Java 中用于显式引发异常的关键字。

super() - super() 方法用于调用父类中的方法。

现在我们将讨论 Java 中处理除零异常的不同方法,并实现 Java 代码。

方法 1:使用 try-catch 块

在这种方法中,我们使用 Java 中的 try-catch 块来处理除零异常。我们在此方法中遵循的步骤如下:

  • 我们为分子和分母初始化两个数字。我们将分母初始化为零。

  • 在 try 块中,我们编写除法语句,因为它可能引发异常,并在 catch 块中,我们使用算术异常处理异常。

现在,让我们看看 Java 中实现代码的示例。

示例

在此示例中,我们初始化两个变量“numerator”和“denominator”,我们确保将分母初始化为零,并执行除法运算,因为我们不能使用零执行除法,所以会引发异常,并使用 catch 块捕获。

//Java program to handle divide by zero exception
import java.util.*;
public class Main{
   public static void main(String[] args) {
      
      int numerator  = 7;
      int denominator = 0;
      try {
         int answer = numerator / denominator;
         System.out.println("Result: " + answer);
      } catch (ArithmeticException ex) {
         System.out.println("Error: " + ex.getMessage());
         System.out.println("Cannot divide a value by zero.");
      }
   }
}

输出

Error: / by zero
Cannot divide a value by zero.

方法 2:使用自定义异常类

在这种方法中,我们将实现一个自定义类或程序员创建的类来处理 Java 中的除零异常。我们在此方法中遵循的步骤如下:

  • 我们为分子和分母初始化两个数字。分母值初始化为零。

  • 我们为除零异常创建一个自定义类,该类扩展了 Exception 类

  • 在 try 块中,我们显式引发异常并使用 catch 块调用自定义类来处理异常。

示例

在此示例中,我们创建了一个“DivideByZeroException”自定义类并扩展了“Exception”。此类处理除以零引起的异常。当在 main 方法中引起异常时,我们通过使用“new”关键字创建类的对象来使用“throw”关键字调用自定义类。

import java.util.*;
class DivideByZeroException extends Exception {
   public DivideByZeroException(String message) {
      super(message);
   }
}
public class Main {
   public static void main(String[] args) {
      int numerator = 5;
      int denominator = 0;
      try {
         if (denominator == 0) {
            throw new DivideByZeroException("Error: Cannot divide a number by zero.");
         }
         int answer  = numerator / denominator;
         System.out.println("Result: " + answer);
      } catch (DivideByZeroException ex) {
         System.out.println(ex.getMessage());
      }
   }
}

输出

Error: Cannot divide a number by zero.

处理多个异常

处理多个异常只不过是为单个 try 块提供多个 catch 块,并处理 try 块中发生的多个异常。我们将处理不同类型的异常,并使用每个 catch 块处理它们。

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

步骤

  • 声明一个 try 块并初始化两个整型变量,即 numerator 和 denominator。denominator 变量初始化为 0。

  • 现在,如果 denominator 值等于零,则引发 ArithmeticException。

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

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

示例

在此示例中,我们使用单个 try 块后跟多个 catch 块。如果 try 块引发 ArithmeticException,则执行处理 ArithmeticException 代码的 catch 块。如果 try 块引发 NullPointerException,则执行该特定 catch 块。如果 catch 块未处理 try 块引发的特定异常,则执行最后一个 catch 块代码,因为它处理通用 Exception 案例。从示例中,由于 denominator 值初始化为零,我们使用“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: 
Cause: null
java.lang.ArithmeticException
	at Main.main(Main.java:7)

因此,在本文中,我们讨论了如何处理除以零引起的异常以及如何在 Java 中使用不同的方法处理多个异常。

更新于: 2024年5月31日

8K+ 次浏览

开启你的职业生涯

通过完成课程获得认证

立即开始
广告