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日

相关文章

  • C++中的RAII机制详解

    C++中的RAII机制详解 什么是RAII RAII是一种资源获取即初始化的技术,它能够确保在使用完资源后,自动释放资源。RAII在C++中是一种很常见的技术,可以被用于管理内存、文件句柄、互斥锁等各种资源。 RAII的实现方式 RAII的实现方式是通过C++的构造函数和析构函数来实现的。C++中的构造函数用于初始化对象的内部状态,而析构函数则在对象被销毁时…

    C 2023年5月22日
    00
  • C++示例详解Prim算法与优先队列

    C++示例详解Prim算法与优先队列 什么是Prim算法? Prim算法是一种经典的最小生成树算法,它可以用于求无向连通图的最小生成树。该算法以一个顶点开始,通过不断地向外扩张生成最小生成树,最终遍历图中所有节点,并且每次扩张的时候选择权值最小的边。 Prim算法的实现流程 选取一个起始节点开始。 初始化辅助数组,该数组用来记录图中每个节点是否已经被访问,以…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 位运算符~的高级用法

    前言 在上一篇文章中,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、相反数 我们可以利用负数的补码性质,来获得一个正数的相反数 #include <stdio.h> int ma…

    C语言 2023年4月17日
    00
  • jsoup 框架的使用小结

    下面来详细讲解一下“jsoup 框架的使用小结”的完整攻略。 什么是jsoup框架 jsoup是一个Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了类似于JQuery的CSS选择器,用于从HTML解析出DOM,也可用于HTML的提取和转换。 jsoup框架的安装和使用步骤 安装方式 直接从官网下载jar包:https://jso…

    C 2023年5月23日
    00
  • C++学习进阶篇之类大小计算和this指针

    C++学习进阶篇之类大小计算和this指针 类大小计算 在C++中,类的大小计算是非常重要的。一个类的大小包括它所占用的存储空间以及它所包含的成员变量所占用的存储空间。在计算类的大小时,通过以下几个方面来确定: 子对象的大小 虚拟函数表指针的大小 数据成员的大小 子对象的大小 类可能会继承其他类,所以需要考虑子对象的大小。子对象的大小实际上是在编译时计算的,…

    C 2023年5月30日
    00
  • C++中的多态问题—理解虚函数表及多态实现原理

    以下是“C++中的多态问题—理解虚函数表及多态实现原理”的详细攻略: 什么是多态 多态是指在C++中,可以使用指向基类的指针或引用,来调用子类重载后的方法或重写的方法,达到动态调用的效果。多态可以提高代码的可读性和复用性,让代码变得更具扩展性和灵活性。 C++多态实现原理 C++中多态的实现原理主要是利用了虚函数和虚函数表的机制。虚函数是一种特殊的成员函数,…

    C 2023年5月22日
    00
  • Perl时间处理函数用法介绍

    Perl时间处理函数用法介绍 在Perl编程中,时间的处理是非常常见的操作。Perl提供了丰富的时间处理函数,可以方便开发者对时间进行格式化、计算等操作。在本篇文章中,我们将重点介绍Perl时间处理函数的用法和示例。 时间获取函数 localtime() localtime()函数可以获取当前系统时间。它的返回值是一个数组,包含了当前时间的年、月、日、时、分…

    C 2023年5月22日
    00
  • Python JSON模块的使用详情

    Python JSON模块的使用详情 什么是JSON? JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式为基础,通常用于在网络之间传输数据。在Python中,有一个常用的模块叫做json,可以方便地对JSON数据进行编码和解码操作。 序列化与反序列…

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