有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java抛出子句的意义是什么?

我理解检查异常的意义:提醒开发人员您需要注意的错误。我也理解,如果无法从异常中恢复,则不处理这些异常的意义 但是为什么,如果您决定不处理已检查的错误,您必须包含throws语句 如果运行此代码,则会出现运行时错误,如果注释掉throws语句(并添加{),则会出现编译时错误。如果仍然中断程序,那么将错误抛出main()似乎没有意义

import java.io.IOException;

public class Blah {

    public static void main(String[] args) 
        throws IOException {

        throw new IOException();

    }

}

共 (4) 个答案

  1. # 1 楼答案

    I understand the point of checked exceptions: to remind the developer of errors that you need to be aware of.

    事实上,它比这更强大。关键是强制开发人员(您)在应用程序的某个点上对错误采取措施。您可以执行以下两种操作之一:

    • 您可以在抛出异常的同一方法体中捕获并(希望)处理该异常

    • 您可以将异常添加到方法的throws列表中。。。以便它传播到方法的调用方。这就把处理异常的最初责任放到了调用方代码上

    在这种(一般)背景下,throws的观点是明确的。如果该语言没有throws声明,那么Java的检查异常设计将无法工作1

    就Java语言规范而言,这些规则同样适用于所有Java方法,包括main方法。所以你必须在你的main上加上“无意义的”throws IOException。但这真的毫无意义吗?我认为没有。考虑如下:

    • 如果允许异常从应用程序的入口点main传播出去,那么用户会看到一个丑陋的堆栈跟踪。就他/她而言,您的应用程序已“崩溃”

      如果发生IOException,Java编译器告诉您的main方法将“崩溃”不是更好吗

    • 假设应用程序中有两个类,它们都有一个main方法。是否应该允许它们都传播检查过的异常而不声明它们

    • 如果应用程序的代码库包含对main方法的特定调用,那么情况又如何呢。像对待其他电话一样对待这样的电话不是更好吗。。。这取决于在throws子句中声明已检查异常的main方法

    如您所见,希望main方法遵循与其他方法相同的异常规则,这是有充分理由的


    1-要么您必须用抛出的方法捕获已检查异常,而库方法不能抛出已检查异常,要么您需要在加载时对每个应用程序进行全局分析,以查看是否捕获了已检查异常

  2. # 2 楼答案

    throws子句表示允许方法抛出某些异常。它规定了方法与其调用方之间的契约,让调用方知道它可以抛出哪些已检查的异常,从而知道调用方应该准备处理哪些异常,但是被调用的方法不必每次都抛出它们,或者根本不必抛出它们

  3. # 3 楼答案

    如果另一个程序使用该方法,它需要能够捕获并处理它

  4. # 4 楼答案

    通过将异常添加到methods throws子句来“回避”异常的意义在于,在创建其他人将要使用的代码时,它具有灵活性。。也许您的代码会得到异常,但您更希望方法的调用方处理异常,而不是自己处理异常,这样调用的开发人员就可以知道发生了什么,而不是只是重新抛出异常或返回空值