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语言中程序如何调用Python脚本

    在C语言中,我们可以通过调用Python解释器来执行Python脚本。实现这个功能需要使用到Python标准库中的Python.h头文件和相关函数。 下面是完整的攻略,包含两个实例: 1. 准备Python解释器 在C语言中调用Python脚本之前,我们需要先准备好Python解释器。具体步骤如下: 安装Python解释器 首先我们需要安装Python解释器…

    C 2023年5月23日
    00
  • C++简明图解分析静态成员与单例设计模式

    C++语言中,可以通过类的静态成员实现单例设计模式,下面是详细的攻略: 一、静态成员介绍 1.1 定义静态成员 静态成员是类的一种特殊成员,它属于类的整体,而不是属于类的某个对象。在类定义中,通过关键字 static 能够定义静态成员,如下所示: class ClassName { public: static int staticVar; // 定义静态成…

    C 2023年5月22日
    00
  • C++函数对象Functor与匿名函数对象Lambda表达式详解

    C++函数对象Functor与匿名函数对象Lambda表达式详解 什么是函数对象? C++中的函数对象指的是重载了“()”运算符的类,可以像函数一样被调用,也被称为仿函数。与普通的函数不同的是,函数对象可以保存状态信息或者自定义行为,更加灵活。 在实现上,函数对象重载的“()”运算符应该是一个const成员函数,参数及返回值根据需要而定。函数对象的实现可以参…

    C 2023年5月22日
    00
  • Linux管道通信C语言编程示例

    我们来详细讲解一下“Linux管道通信C语言编程示例”的完整攻略。 什么是Linux管道通信 Linux管道通信是一种进程间通信方式,它通过特殊的管道文件连接两个或多个进程,使数据在进程之间传递。简单来说,就是在两个进程之间建立一个管道,让它们可以通过这个管道进行数据交换。 管道通信C语言编程示例 下面我们就来看一下管道通信的C语言编程示例。这里我们介绍两个…

    C 2023年5月23日
    00
  • C#中ToString数据类型格式大全(千分符)

    C#中的ToString()方法可以将一个对象转换成字符串类型。当我们使用ToString()方法时,可以携带一个参数。这个参数可以是标准格式字符串,也可以是自定义格式字符串。在这个参数中,我们可以设置Convert类中的几种数据类型格式。 以下是数据类型格式大全: c/C:货币(Currency)格式; d/D:十进制(Decimal)格式; e/E:科学…

    C 2023年5月24日
    00
  • 电视盒子排行榜 剁手都要买的五大直播神器

    电视盒子排行榜 剁手都要买的五大直播神器 如果您想要追剧、看球赛、听音乐等,电视盒子是一个非常不错的选择。那么,如何选购一款好的电视盒子呢?以下是电视盒子排行榜上的五款直播神器,它们不仅拥有强大的性能,而且价格也非常实惠。 一、小米电视盒子3 增强版 小米电视盒子3 增强版是一款非常不错的电视盒子。它支持高清视频播放和在线直播,还有精选优秀应用,如爱奇艺、腾…

    C 2023年5月22日
    00
  • 利用C语言实现页面置换算法的详细过程

    首先我们来介绍一下页面置换算法。页面置换算法是操作系统内存管理中的重要概念,用于管理虚拟内存。其作用是当物理内存不足时,将其中的某些页面(page)调出到磁盘上,以便有需要时再调入内存,从而释放出一些物理内存空间。 常见的页面置换算法有FIFO(先进先出)、LRU(最近最少使用)、Clock(基于FIFO的改进算法)等。下面我们以LRU算法为例,介绍如何利用…

    C 2023年5月22日
    00
  • JSON 基本使用教程

    JSON 基本使用教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读并编写,便于机器解析和生成。它基于JavaScript语言的一个子集,因此它的使用十分广泛。本文将详细讲解JSON的使用。 1. 数据结构 JSON的数据结构只包含以下两种类型: 对象(Object):由花括号{}包含,键值对之间用逗…

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