java 异常之手动抛出与自动抛出的实例讲解

Java 异常之手动抛出与自动抛出的实例讲解

在 Java 语言中,异常是一个重要的特性,用于处理运行时的错误或异常情况。Java 异常是一个对象,表示在程序执行期间发生的异常情况。在 Java 中,异常通常分为检查异常和非检查异常两种。

异常类型

  1. 检查异常:是指在编写程序时必须进行捕获或者在方法中进行抛出声明的异常,例如 IOExceptionInterruptedExceptionClassNotFoundException
  2. 非检查异常:也称为运行时异常,通常表示程序运行时的错误或异常情况,例如 NullPointerExceptionArrayIndexOutOfBoundsExceptionArithmeticException

异常的自动抛出

Java 异常的自动抛出指的是:在程序运行时,如果发生某些特定的错误或异常情况,Java 运行时系统会自动创建并抛出对应的异常对象。这些异常通常是非检查异常,由于 Java 运行时系统会自动抛出,因此,我们把它们叫做自动抛出的异常。

例如,在下面的代码中:

public class AutoThrowDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);
    }
}

在第四行中,我们访问了数组 arr 的第四个元素,但是,该数组只有三个元素,因此在运行时会出现数组越界异常。这种异常是自动抛出的,在运行时系统自动生成异常对象并抛出。

异常的手动抛出

Java 异常的手动抛出指的是:在程序执行过程中,开发者可以通过代码显式地手动抛出异常对象。这些异常可以是检查异常或者非检查异常,我们把它们叫做手动抛出的异常。

例如,在下面的代码中:

public class ManualThrowDemo {
    public static void main(String[] args) {
        int age = -10;
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}

在第四行中,我们通过 throw 语句手动抛出了一个 IllegalArgumentException 异常对象,表示年龄不能为负数。

示例说明

示例 1:手动抛出异常

在许多情况下,我们需要根据不同的情况显式地抛出异常,以便更好地处理异常情况。

例如,我们现在想要编写一个函数来计算两个正数的商,但是,如果除数为零,那么就不能进行计算。这时候,我们可以通过手动抛出异常的方式来处理这种情况,具体代码如下:

public class DivisionDemo {
    public static double divide(int dividend, int divisor) throws ArithmeticException {
        if (divisor == 0) {
            throw new ArithmeticException("Division by zero");
        }
        return ((double)dividend) / divisor;
    }

    public static void main(String[] args) {
        int a = 10, b = 5;
        System.out.println(divide(a, b));
        int c = 10, d = 0;
        try {
            System.out.println(divide(c, d));
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

在上面的代码中,我们定义了一个 divide 方法,该方法接受两个整数参数 dividenddivisor,计算 dividend/divisor 的商,如果 divisor 为零,则手动抛出 ArithmeticException 异常对象。在 main 函数中,我们首先调用了 divide(10, 5),由于 divisor 不为零,因此程序正常执行并输出 2.0;而后,我们调用了 divide(10, 0),这时由于 divisor 为零,程序会接收到 ArithmeticException 异常对象,并输出 Error: Division by zero

示例 2:自动抛出异常

在编写程序时,我们尽可能地避免发生自动抛出的异常情况,但是,某些情况下,我们可以利用自动抛出的异常来优化代码。

例如,我们现在想要编写一个函数来找到一个数组中的最大值,如果数组为空,那么就返回 Integer.MIN_VALUE。这时候,我们可以通过自动抛出异常的方式来处理这种情况,具体代码如下:

public class MaxValueDemo {
    public static int getMax(int[] arr) {
        if (arr == null || arr.length == 0) {
            throw new IllegalArgumentException("The array is empty.");
        }
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        System.out.println(getMax(arr));
        int[] emptyArr = {};
        try {
            System.out.println(getMax(emptyArr));
        } catch (IllegalArgumentException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

在上面的代码中,我们定义了一个 getMax 方法,该方法接受一个整数数组 arr,返回数组中的最大值。如果数组为空,那么就抛出一个 IllegalArgumentException 异常对象。在 main 函数中,我们首先调用了 getMax({1, 3, 5, 7, 9}),由于数组中有元素,因此程序正常执行并输出 9;而后,我们调用了 getMax({}),这时由于数组为空,程序会自动抛出 IllegalArgumentException 异常对象,并输出 Error: The array is empty.

小结

从本文中我们可以了解到异常的自动抛出和手动抛出的区别,以及如何使用异常来处理程序中的错误情况。在编写程序时,我们需要正确地捕获和处理不同类型的异常,以便让我们的程序更加健壮。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 异常之手动抛出与自动抛出的实例讲解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 上网出现20种错误信息的分析

    上网出现20种错误信息的分析 当我们上网时,难免会遇到各种各样的错误信息,有些可能会给我们造成一定的困扰,甚至影响我们的正常使用。这篇文章将分享一些常见的错误信息及其解决方案,帮助读者更好地理解和解决问题。 1. DNS错误 描述: 当你输入一个网址时,会出现“无法访问网站”或“未找到服务器”的提示,这通常是DNS错误导致的。 解决方案: 检查你的网络设置,…

    C 2023年5月23日
    00
  • C++实现截图截屏的示例代码

    下面是“C++实现截图截屏的示例代码”的详细攻略: 一、使用Windows API Windows API提供了一系列函数来实现截图截屏的功能。其中,最常用的是BitBlt函数。以下是示例代码: #include <Windows.h> #include <iostream> int main() { // 获取屏幕DC HDC hd…

    C 2023年5月23日
    00
  • C++解析特殊符号tab、换行符号实例代码

    好的。 C++解析特殊符号tab、换行符号实例代码 1. tab符号解析 Tab符号的特殊字符是\t,表示在一个字符串中加入Tab空格。 下面是一个例子,演示如何在C++中使用\t来生成Tab: #include <iostream> int main() { std::cout << "Name:\tJohn" …

    C 2023年5月24日
    00
  • Spring事务捕获异常后依旧回滚的解决

    当Spring事务捕获到异常后,通常情况下会自动进行回滚操作,但是有时候我们需要在某些异常情况下不进行回滚。这个时候就需要对Spring事务进行特定的配置来实现。 以下是”Spring事务捕获异常后依旧回滚的解决” 的完整攻略: 1.配置@Transactional注解 要配置较为简单方便地解决回滚问题,我们可以直接使用@Transactional注解进行配…

    C 2023年5月23日
    00
  • C语言版停车位管理系统

    下面我会详细讲解一下“C语言版停车位管理系统”的完整攻略。 1. 确定系统需求 在编写停车位管理系统之前,需要确定系统的具体需求,包括需要管理的停车位数量、停车位状态以及在用户进出停车场时需要记录的信息等。在系统需求确定后,方便后续的代码编写和功能实现。 2. 设计系统架构 基于系统需求,需要设计一个合理的系统架构,包括模块划分、类的设计、关键数据结构的选择…

    C 2023年5月23日
    00
  • C++类的返回值是*this的成员函数问题

    C++类的成员函数,除了默认拥有一个指向调用该函数的类对象的指针this外,还可以返回一个指向该类对象的引用。而对于返回值为该类对象本身的情况,实际上返回的是指向该类对象的引用*this。 以下是具体的实现过程及示例说明: 1. 类的定义 首先,假设我们定义了一个名为MyClass的类,其中包含两个私有成员变量x和y。 class MyClass { pri…

    C 2023年5月22日
    00
  • C++如何动态的生成对象详解

    C++如何动态的生成对象详解 在 C++ 中我们可以使用 new 关键字来动态的生成一个对象,然而有时候我们需要在程序运行时根据一些特定条件创建一组对象,这时候就需要用到动态生成对象的方法。 1. 动态生成对象的基本方法 在 C++ 中,我们可以通过调用构造函数来创建一个对象,因此我们也可以通过在内存中创建对象的方式来动态生成对象。 首先需要使用 void*…

    C 2023年5月22日
    00
  • MySQL 数据库的约束及数据表的设计原理

    MySQL 数据库的约束及数据表的设计原理是数据库设计的重要组成部分。在进行数据库设计时,约束可以帮助程序员确保数据的完整性和一致性,防止出现错误的数据输入或外键缺失等问题,有效提高了数据表的安全性和稳定性。 数据库的约束 MySQL 数据库一共支持五种类型的约束:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY 和 CHECK…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部