java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java抛出异常

Java面试必考之如何在项目中优雅的抛出异常

作者:小威要向诸佬学习呀

这篇文章主要为大家详细介绍了Java中的几种异常关键字和异常类相关知识,本文比较适合刚入坑Java的小白以及准备秋招的大佬阅读,需要的可以收藏一下

Java中的异常分类

Java中的异常机制是一种用于处理程序运行时错误和异常情况的机制。当程序运行时出现问题,如无法找到文件或网络连接失败等,就会抛出异常。这个过程称为“抛出异常”。

在Java中,所有的异常都是派生自java.lang.Throwable类。Throwable类有两个直接的子类:Exception和Error。Exception表示可处理的异常,而Error表示不可处理的异常。

首先详细介绍下Error:

错误(Error):是一些无法恢复或不可处理的错误,通常是由 JVM 或底层操作系统引起的,比如 OutOfMemoryError、StackOverflowError 等。错误无法被捕获和处理,只能通过修改程序代码或增加硬件资源等手段来避免。
而对于Exception异常类,有以下两种类型:

受检查异常/编译时异常(Checked Exception):也称为已检查异常,这些异常在编译时就必须进行处理,否则会导致编译错误。通常是由外部不可控的因素引起的,比如输入/输出错误、网络异常、数据库访问异常等。受检查异常包括 IOException、SQLException 等。

运行时异常(Runtime Exception):也称为未检查异常,这些异常在编译时不要求必须进行处理,程序员可以选择处理或不处理。通常是由程序中的逻辑错误引起的,比如空指针引用、下标越界、算术异常等。运行时异常包括 NullPointerException、IndexOutOfBoundsException、ArithmeticException 等。

如何处理异常

上面讲述了异常的分类,那么我们如何处理异常呢?

这里先给出答案,我们可以通过一些关键字或者代码块处理异常,接下来将详细介绍下几种方式。

try…catch…finally

Java 异常机制基于三个关键字:try、catch 和 finally。我们开发者可以将可能抛出异常的代码放在 try 语句块中,在 catch 块中捕获并处理这些异常,也可以使用 finally 块在任何情况下都执行必要的清理工作。

其结构如下所示:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e) {
    // 处理 ExceptionType1 类型异常
} catch (ExceptionType2 e) {
    // 处理 ExceptionType2 类型异常
} finally {
    // finally 块中的代码始终都会被执行
}

在上面的代码中,我们使用 try-catch 来捕获可能抛出的受检查异常和运行时异常,对于必须关闭的资源,我们通常会在 finally 块中进行关闭。

无论 try 块中是否发生异常,finally 块中的代码都会被执行。finally 块通常用于释放资源、清理工作等操作,比如关闭文件句柄、释放内存等。即使在 try 或 catch 块中有 return 语句,finally 块也会在这些语句之后执行。

需要注意的是,finally 块不一定要和 catch 块一起使用,也可以单独出现。此外,在 Java 7 中,还引入了一个新的关键字 try-with-resources,用于自动释放资源的处理方式,可以进一步简化代码。

try-with-resources

try-with-resources是Java 7引入的一种新的异常处理机制,主要用于处理需要关闭资源的情况。在这种机制下,我们可以通过try块中声明资源对象的方式,自动管理这些资源对象的释放和关闭。

使用try-with-resources机制的代码结构如下:

try (ResourceType resourceVar1 = ResourceInitialization1;
     ResourceType resourceVar2 = ResourceInitialization2;
     ...) {
    // Code that uses the resourceVar1 and/or resourceVar2.
} catch (ExceptionType e) {
    // Exception handling code.
}

在这里,ResourceType是需要关闭的资源类型,resourceVar是资源变量名,ResourceInitialization是一个表达式,用来初始化资源。多个资源之间用分号分隔。在try块结束后,程序会自动调用资源的close方法,从而释放资源。

try-with-resources机制使得资源管理变得更加简单、可读性更强,并且减少了忘记释放资源的可能性。此外,此机制还支持对异常处理的自动化控制,可以简化代码的结构和调试过程。

当然,这里也有我们需要注意的点,只有实现了AutoCloseable接口的资源对象才能够在try-with-resources机制下使用。如果资源对象未实现AutoCloseable接口,则需要使用上面介绍的传统的try-catch-finally语句块来手动释放资源。

throw关键字处理异常

在处理异常时,throw关键字用于手动抛出异常。使用 throw 语句时,在代码块中会创建一个指定异常类的对象,该对象包含有关异常类型和异常信息的详细信息,并将其传递给调用者。

throw 语法如下所示:

throw exceptionObject;

其中,exceptionObject 表示要抛出的异常对象。exceptionObject 必须是 throwable 类或其子类的一个实例。

通常情况下,在某些条件不满足时需要抛出异常,而这种情况违反了当前环境和程序逻辑的约束。由于异常的提出与处理可能更加容易,因此认为抛出异常是一种更好的解决方案。

我们以一个简单的示例,说明如何使用 throw 语句来显式抛出一个异常:

public class Example {
    public static void main(String[] args) {
        try {
            int a=10, b=0;
            if(b==0)
                throw new ArithmeticException("除数为0");
            else
                System.out.println(a/b);
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        }
    }
}

在这个例子中,当被除数值等于零时,它将执行 throw 语句向次级方法抛出 ArithmeticException 异常。如果没有抛出异常,将在 console 中打印结果。

最后需要注意的是,当代码遇到 throw 语句时,它将立即停止当前代码块的执行,并将控制权传递到异常处理程序中。如果没有定义错误处理程序,则会引发运行时错误并终止程序的执行。因此,在使用 throw 语句之前,需要确保适当地处理异常。

throws关键字处理异常

在使用throws关键字处理异常,throws关键字用于告诉编译器一个方法可能会抛出哪些类型的异常。这个关键字通常用在方法的声明中,并且可以跟一个或多个异常类名。

方法声明示例:

public void readFile() throws IOException {
    // code that reads file.
}

在上面的代码中,readFile()方法可能会抛出IOException异常,因此使用了throws关键字来声明。这意味着在调用该方法时,调用者必须处理或重新抛出IOException异常。

当有多个异常可能会被抛出时,可以使用逗号分隔它们:

public void connectToServer() throws IOException, InterruptedException {
    // code that connects to server.
}

如果一个方法没有通过throws关键字声明可能会抛出的异常,而在方法内部又抛出了异常,那么编译器将会提示一个编译错误。

使用throws关键字,可以使得我们更好地组织自己的代码,并且提高代码的可读性和可维护性。调用者可以根据方法声明中列出的异常类型,进行更加精准的异常处理。同时,使用throws关键字也要求方法实现者更加注意异常处理,并且编写更加健壮的代码。

throw关键字和throws关键字区别

上面我们介绍了throw和throws关键字来处理异常,相信火眼金睛的大佬可能已经看出了两者的区别,在这里再总结一下:

throw 关键字:

throw 是一个操作符,用于手动抛出一个异常对象。

通常情况下,在某些条件不满足时需要抛出异常,违反了当前环境和程序逻辑的约束。使用 throw 能够显式地抛出一个异常,使错误信息更加清晰明确。

throws 关键字:

throws 关键字用于方法签名中,用于声明给调用者该方法可能会抛出的异常类型方便捕获处理或者继续向外抛出(由上层处理)。

如果一个方法可能会抛出异常,就可以使用 throws 在方法声明中指定该异常。这样做是为了让调用该方法的代码知道处理这个异常,或者依次传递给其上层方法来处理。

throws 可以声明多个异常,例如: public void testMethod() throws Exception1, Exception2 {...}

上述两个关键字的区别在于,throw 是用于手动抛出异常,而 throws 是在方法签名中声明该方法有可能会抛出的异常并把异常交给其他方法进行处理。

使用 throw 抛出异常时,要么在方法内部 try…catch 捕获并处理,要么通过 throws 在方法签名中声明可能抛出的异常类型。

到此这篇关于Java面试必考之如何在项目中优雅的抛出异常的文章就介绍到这了,更多相关Java抛出异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文