首页 > 新闻 > 什么是 Java 抛出异常?

什么是 Java 抛出异常?

2023-01-14 小编

您的信用卡有限额,如果您消费超过限额,您的购买可能会被拒绝。这种超出限制以接收负面响应的概念并不仅仅特定于信用卡 - 在Java中,可以根据特定要求接受或拒绝许多事情。

学习如何抛出 java 异常的人

Java & JavaScript 简介

例如,当Java方法尝试执行无效的操作时,我们说它“抛出异常”。本文将重点介绍如何在 Java 中抛出异常。我们还将介绍一些不同类型的异常、如何捕获它们以及如何创建自定义异常。

因此,无论您是想弄清楚如何在 Java 中抛出异常,还是想了解有关 Java 异常处理如何工作的更多信息,本文都适合您。

什么是 Java 抛出异常

在 Java 中,异常是表示错误的对象。它发生在程序执行期间,并破坏正常的指令流。当程序遇到特殊情况时,将“抛出”异常。根据程序的编写方式,可能会捕获并处理此异常,或者可能导致程序崩溃。

发生异常时,Java 运行时系统 (JVM) 会自动创建一个对象,其中包含有关错误的信息。然后,此对象将向上传递调用堆栈,直到由某些代码处理。如果没有代码捕获异常并输出错误消息,程序将终止。

异常与错误

需要注意的是,Java 程序中可能会出现两种类型的问题:异常和错误。异常(大部分)是可恢复的,而错误则不是。

错误通常是由您无法控制的问题引起的,例如硬件故障或内存不足。由于错误无法从中恢复,因此它们始终会导致程序终止。另一方面,异常指示应用程序可能能够恢复的条件。

例如,如果您的程序尝试读取的文件找不到,则这是一个例外。程序可以捕获此异常,并提示用户输入新文件名。但是,如果您的程序尝试从不存在的文件读取,则会导致错误 - 您的程序无法恢复任何操作。

现在我们已经讨论了异常和错误之间的区别,让我们看看如何在 Java 中抛出异常。

如何在 Java 中抛出异常

在 Java 中有两种抛出异常的方法:使用 “throw” 关键字或创建 Exception 类的新实例。

我们将首先了解如何使用 “throw” 关键字引发异常。为此,您需要创建 Exception 类的新实例,然后将其传递给 “throw” 关键字。

引发异常的语法如下。

throw new Exception("Exception message");

使用语法,假设我们有一个计算三个数字平均值的方法。但是,如果任何数字小于 0,我们希望抛出异常。该方法如下所示:

public static double average(double a, double b, double c) {

    if (a < 0 || b < 0 || c < 0) {
        throw new IllegalArgumentException("Can't have negative numbers");
    }

    return (a + b + c) / 3.0;}

在此示例中,我们使用“throw”关键字来抛出IllegalArgumentException。JVM 将捕获此异常,并输出错误消息。我们可以抛出已检查或未选中的异常,我们将在后面讨论。

自定义例外

除了 Java 中的内置异常之外,您还可以创建自己的自定义异常。创建自定义例外允许您向用户提供更多信息性的错误消息。

可以通过扩展 Exception 类来创建自定义异常。例如,假设我们要为无效输入创建自定义异常。异常可能如下所示:

public class InvalidInputException extends Exception {

   public InvalidInputException(String message) {
       super(message);
   }}

在上面的示例中,父类是 Exception。此类为所有异常提供基本功能。类是 Exception 的子级,为无效输入提供特定的实现。

现在,我们可以像使用内置异常一样使用自定义异常。抛出 InvalidInputException 的代码如下所示:

throw new InvalidInputException("Invalid input");

上面的代码将创建一个新的异常,其中包含以下消息:“输入无效”。

现在我们知道了如何抛出异常,让我们看看如何捕获它们。

如何在 Java 中捕获异常

引发异常时,Java 运行时系统会自动创建一个包含错误相关信息的对象。然后,此对象将向上传递调用堆栈,直到某些代码处理它。

如果没有代码捕获异常并输出错误消息,程序将终止。但是,如果捕获异常,则可以以某种方式处理它,然后继续运行程序。

您可以使用“try”和“catch”关键字来捕获Java中的异常。“try”关键字指示可能发生异常的代码段。“catch”关键字捕获异常并处理它。

请看以下示例:

try {
    //Code goes here} catch (IOException e) {
    //Handle the exception}

在此代码中,“try”块包含可能引发 IOException 的代码。如果发生IOException,它将被“catch”块捕获,该块将以某种方式处理它。

注意:对于单个“try”块,您可以有多个“捕获”块。如果要以不同的方式捕获不同类型的异常,这将非常有用。例如:

try {
   //Code goes here} catch (IOException e) {
   //Handle the IOException} catch (CustomException e) {
   //Handle the CustomException}

在此代码中,有两个“捕获”块。第一个“catch”块捕获IOExceptions,第二个“catch”块捕获CustomExceptions。如果发生 IOException,它将由第一个“catch”块处理,如果发生 CustomException,它将由第二个“catch”块处理。

除了“try”和“catch”块之外,您还可以有一个“最终”块。“finally ”块将始终执行,无论是否引发异常。例如:

try {
    //Code goes here} catch (IOException e) {
    //Handle the IOException} catch (CustomException e) {
    //Handle the CustomException} finally {
    //Execute this code no matter what}

在此代码中,无论是否引发异常,“finally ”块都将执行。这对于清理任务(如关闭文件或数据库连接)非常有用。

现在我们已经了解了如何引发和捕获异常,让我们看看已检查异常和未检查异常之间的区别。

Java 中的异常类型

Java 中有两个例外:选中和未选中。让我们看一下这些类型的异常之间的区别。

已检查的异常

选中的异常在编译时发生,并由编译器检查。如果编译器未捕获异常,则程序将不会编译。

必须捕获检查的异常,或者在它们发生它们的方法中声明。编译器将查找“try”、“catch”或“throws”关键字来处理检查的异常。

如果我们有一个打开文件的方法,但该文件不存在,则会抛出已检查的异常。请看以下示例。

try {

   FileReader file = new FileReader("doesntexist.txt");} catch (FileNotFoundException e) {

   System.err.println("File not found");}

在上面的示例中,我们使用 try-catch 块来捕获 FileNotFoundException。“try”块包含可能引发异常的代码。 “catch”块包含在引发异常时将执行的代码。如果找到文件,则不会执行 catch 块中的代码。

捕获异常是由用户输入或代码中发生的问题(如 NullPointerException)引起的。

已检查异常的示例包括:

  • IOException - 当输入或输出操作失败或中断时引发。
  • ClassNotFoundException - 当尝试通过类的字符串名称加载类,但找不到该类的定义时,将引发。
  • SQLException - 在发生数据库访问错误或与数据库的连接丢失时引发。

未选中的异常

未经检查的异常在运行时发生,编译器不会检查这些异常。这些异常通常是由编程错误、API 使用不当或逻辑错误引起的。

例如,如果我们尝试将一个数字除以 0。与已检查的异常不同,您无需捕获或声明未经检查的异常。但是,这样做被认为是最佳做法。

以下是捕获未经检查的异常的方法:

try {
    int result = num / 0;} catch (ArithmeticException e) {
    System.err.println("Can't divide by zero");}

在上面的例子中,我们试图将一个数字除以 0,这将抛出一个 ArithmeticException。我们使用 try-catch 块来捕获此异常并打印错误消息。

未经检查的异常示例包括:

  • NullPointerException - 当您尝试访问空对象的成员时,会发生此异常。
  • IllegalArgumentException - 当您将非法参数传递给方法时,会发生此异常。
  • IndexOutOfBoundsException - 当您尝试访问具有超出边界的索引的数组或集合的元素时,会发生此异常。

如您所见,Java 中有两种类型的异常:选中和未选中。必须捕获或声明选中的异常,而不需要捕获或声明未选中的异常。但是,最佳做法是捕获或声明所有异常。

进一步了解 Java 抛出异常 

由于错误可能发生在任何程序中 - 无论写得多么好 - 重要的是要知道如何在异常发生时处理它们。异常允许您编写更可靠的代码,这些代码可以优雅地处理意外情况,而不是崩溃。

通过抛出异常,我们可以告诉 Java 运行时系统出了点问题,我们需要它来执行一些特定的操作。在本文中,我们介绍了如何引发异常以及如何捕获异常。您可以通过探索一些 Java 内置异常类或创建自己的自定义异常来进一步了解如何使用异常。


*必填

您好,访客!有什么新鲜事想告诉大家?

点击按钮快速添加回复内容: 高兴 支持 激动 给力 加油 生气 路过 威武
发表
暂时还没评论,等你发挥!