Java 处理除以零和多个异常
异常 是不寻常的事件,会中断程序的正常执行流程。当发生异常时,会生成一个名为异常对象的对象,其中包含异常的详细信息,如名称、描述和程序状态。在本节中,我们将编写一个Java程序来处理除以零异常以及如何处理多个异常。
异常的类型:
有三种类型的异常:
- 已检查的异常 - 已检查的异常是编译时异常,即它们在程序编译期间被检查。这些异常不能被忽略,必须由程序员处理。
示例 - IOException、SQLException、ClassNotFounException。
-
未检查的异常 - 未检查的异常是运行时异常,即它们在编译时被忽略,在程序执行期间被检查。
示例 - NullPointerException、ArthemeticException和ArrayIndexOutOfBoundException。
-
错误 - 错误是无法恢复的异常,通常是由于Java虚拟机或系统资源的问题引起的。错误与异常不同,错误不应该被程序员捕捉或处理,因为它们告诉我们存在严重问题,无法由程序修复。
示例 - OutOfMemoryError、StackOverflowError。
Java中不同类型异常的示例
-
ArithmeticException - 当算术运算产生溢出或下溢或除以零时抛出。
-
NullPointerException - 当我们引用一个空对象时抛出。
-
ArrayIndexOutOfBoundsException - 当我们尝试访问超出边界的索引时抛出。
-
IOException - 当输入/输出操作失败时抛出。
-
FileNotFoundException - 当尝试访问不存在的文件时抛出。
异常处理
异常处理 是处理程序执行期间抛出异常的过程,以保持执行流程的连续。在Java中,可以使用 try-catch 块来实现。try块中包含可能引发异常的代码,而catch块中包含处理异常的代码。
我们可以使用内置异常或创建自定义异常。自定义异常继承自Exception类或 RuntimeException 类。
语法
try-catch块 - 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中的除零异常。我们在这种方法中遵循的步骤如下:
- 我们为分子和分母初始化两个数值。分母的值初始化为零。
-
我们为除零异常创建一个自定义类,该类继承自异常类。
-
在try块中,我们明确抛出异常,并使用catch块调用自定义类来处理异常。
示例
在此示例中,我们创建了一个名为’DivideByZeroException’的自定义类,并继承了’Exception’。该类处理由于除以零而引起的异常。当在主方法中引发异常时,我们使用’throw’关键字调用自定义类,通过使用’new’关键字来创建该类的对象。
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块的代码,因为它处理通用的异常情况。从示例中看到,由于denominator值初始化为零,我们使用’throw’关键字抛出一个ArithmeticException,并且执行相应的catch块来处理ArithmeticException。
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中处理多个异常。