当前位置: 首页 > 知识库问答 >
问题:

关于最后的重演

曹高阳
2023-03-14

我在Precise Rethrow的文档中读到,http://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7

基本上,您可以在您的方法的throws子句中列出特定的异常,即使它们不是由捕获块显式处理的,如果:

try块实际上在某个时间点抛出该特定异常。

特定的异常在任何时候都没有被前面的捕获块处理

在方法签名的throws子句中命名的异常必须位于至少一个异常的类层次结构上,该异常正由一个捕获块(子类型或超类型)处理和重新抛出

class OpenException extends Exception {}

class CloseException extends Exception {}

public class PRethrow
{
    public static void main(String args[]) throws OpenException, CloseException, java.io.IOException
    {
        boolean flag = true;
        try
        {
            if (flag)
            {
                throw new OpenException();
            }
            else
            {
                throw new CloseException();
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            throw e;
        }
    } 
}

第一个条件中明确提到,如果try块在某个时间点实际抛出特定异常,则可以在throws子句中列出特定异常

在我的代码中,try块从不抛出java.io.IOExc0019,但仍然在抛出子句中包含它不会产生错误。


共有2个答案

仉峻
2023-03-14

我认为你误解了这篇文章所阐述的情况。文章说,在Java 7中,如果throws子句声明了一个实际上由try块抛出的异常,即OpenExceptionCloseException,那么在throws子句中不声明异常是可以的。从某种意义上说,Java 7的编译器现在足够聪明,知道只有try块才能抛出OpenExceptionCloseException。因此,它不再要求方法声明抛出异常。

这与IOExc0019无关,也不会改变这样一个事实,即您可以声明要抛出任何异常,而不管异常是否真的可以抛出。throws子句只是方法API的一部分。

本条所述条件的要点如下:

public static void main(String args[]) throws OpenException, CloseException, 
                                              java.io.IOException
{
    boolean flag = true;
    try
    {
        if (flag)
        {
            throw new OpenException();
        }
        else
        {
            throw new CloseException();
        }
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
        throw e;       // this causes a compilation error before Java 7
    }
}

在Java7中编译,而不是在Java6中编译。

文寒
2023-03-14

你提到的引语有误导性:

  • 如果在方法体中可能抛出选中的异常,则必须在方法的throws子句中声明该异常

例如,这将编译:

public void m() throws IOException {}
 类似资料:
  • 这个现在的情况是没有HC了,据说是要等一段时间(一个月不等),换部门感觉也不太靠谱,所以退回本行了。 最终篇有还是没有这个看情况吧…… 主管面试(半小时)没有问到技术,常规的价值观问题和了解性对话,考研情况,加班看法,华为价值观,最有成就感的事,最沮丧的事,讨厌的人,有没有女朋友,平时运动,职业规划…… 确实累了,前后两个多月了。因为可能是最后了,也就是告一段落的末尾了,所以还是想说一说…… 前面

  • 保存package.json依赖项的最佳实践是什么? 例如,我看到很多依赖项是不固定的,比如:

  • 目录表 后记 关于作者 关于译者 关于简体中文译本 后记 我在编写本书时使用的几乎所有软件都是 免费开放源码的软件 。在编写本书的第一个草稿的时候,我使用的是Red Hat 9.0 Linux,而现在第六次改写的时候,使用的是Fedora Core 3 Linux。 最初,我使用KWord编写本书(在前言的本书的由来中已经介绍了)。后来,我开始使用DocBook XML和Kate,但是我发现这样太

  • 我正在node.js中为MongoDB数据库构建一个API,并使用fetch函数查询外部API,但是当代码运行时,fetch函数返回以下内容: 我需要做什么才能返回请求的数据? null null

  • 这家伙到底是谁? 作者没有任何特殊的背景或资格[1], 只有一颗冲动的心, 用来写作. [2] 这本书有点偏离他主要的工作范围, HOW-2 Meet Women: The Shy Man’s Guide to Relationships. 他还写了另一本书, Software- Building HOWTO. 最近, 他正打算编写一些短篇小说:Dave Dawson Over Berlin (F

  • 例子是: 相关规则是: 将左值到右值的转换应用于表达式E时 E未进行潜在评估,或 未访问引用对象中包含的值。 我对表达式表示怀疑,它指出未使用。 根据规则: 表达式E的一组潜在结果定义如下: 如果E是一个id表达式([expr.prim.id]),则该集合只包含E。 根据项目符号3,表达式的潜在结果是本身,而确实是的一个成员,这是的潜在结果。然而,我不同意不使用odr的说法。 根据这条规则: ba