Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java中的close()方法会引发异常?_Java_Exception - Fatal编程技术网

为什么java中的close()方法会引发异常?

为什么java中的close()方法会引发异常?,java,exception,Java,Exception,真是个愚蠢的问题,但也许有人有一个聪明的答案: 为什么Java中的close()方法会抛出异常 在我看来,close()是在某种逻辑中调用的最后一个方法,因此它不应该失败,即使它失败了,也应该在类中处理它,而不是抛出异常 谢谢大家 PS:主要问题是关于对象设计和开发方法(不是特定于实现的) 现在您可能是对的,这是有意义的,但是如何很好地编写此类代码: try { } catch (Exception e) { logger.error("Error occured during copy

真是个愚蠢的问题,但也许有人有一个聪明的答案:

为什么Java中的close()方法会抛出异常

在我看来,close()是在某种逻辑中调用的最后一个方法,因此它不应该失败,即使它失败了,也应该在类中处理它,而不是抛出异常

谢谢大家


PS:主要问题是关于对象设计和开发方法(不是特定于实现的)

现在您可能是对的,这是有意义的,但是如何很好地编写此类代码:

try {
} catch (Exception e) {
    logger.error("Error occured during copy", e);
} finally {
    // close all objects
    try {
        connection.close();
    } catch ( ... ) {
        ...
    } finally {
        ...
    }
}

谢谢。

有许多类不涉及关闭操作,例如数据对象、地图、列表,因为这些对象的资源管理很简单

那些提供紧密操作的类通常涉及更复杂的资源管理。它们常常涉及缓冲技术


以file writer为例—在关闭时,缓冲文件内容应该通过与文件同步来持久化,但它可能会由于IO故障而失败。不要让失败静音-因此它可能会抛出异常让您知道。

一般来说,如果最终刷新失败,IOException将在关闭时抛出。这种情况的发生有很多原因。比如说,由于某种原因,您的OutputStream尚未写入文件。调用close()将清除数据,但如果文件被锁定,则会引发IOException。

close()
函数还将在您尝试关闭的连接不存在的情况下引发异常。例如,在JDBC SQL连接中,由于不正确的JDBC URL或用户名或密码,连接可能一开始就没有打开,在这种情况下close()函数将引发异常。

如果您想写得更好,可以使用try with resource include with Java7:

它允许您定义一个资源,例如OutputStream,它将在尝试结束时自动关闭

不会改变引擎盖下的工作方式,但更优雅

在我看来,
close()
是在某种逻辑中调用的最后一个方法,因此它不应该失败,即使它失败了,也应该在类中处理它,而不是抛出异常

有意见是好的。不幸的是,观点并不总是正确的:——)

考虑一下当您关闭包装在
缓冲输出流
中的
文件输出流
时会发生什么:

  • 缓冲区中任何未完成的数据都将被刷新
  • 基础文件描述符为“已关闭”
  • 例如,如果文件系统已满,第一个操作可能会失败

    现在假设应用程序正在编写一个关键文件;e、 g.在UNIX/Linux系统上更新“/etc/passwd”的“adduser”程序。当然,应用程序将分两步完成这项工作。首先,它将写出文件的新版本。如果成功,它会将新文件重命名为旧文件的路径名。(或诸如此类)

    但是,如果我们按照您的需要实现
    close()
    ,应用程序级别将不会知道
    close()
    无法写出所有数据。。。“adduser”将继续在旧版本的基础上重命名新的不完整的“passwd”文件。哎呀!!您刚刚破坏了“/etc/passwd”,没有人可以再登录了。(我希望你手边有备份磁带:-)

    课程:
    close()
    引发的
    IOExceptions
    可能很重要


    你当然是对的,但是在写这种结构的时候感觉有些不对劲

    “try with resources”语法使这一点更好。但是,您不能避免在某个级别处理
    IOException
    ,除非您可以自由声明
    连接的静态类型上的
    close()
    不会引发异常

    “资源试用”版本如下所示:

    try (Connection c1 = openConnection(); 
         Connection c2 = openConnection()) {
       // so stuff
    }
    

    c1
    c2
    都将关闭,即使其中一个
    close()
    方法引发异常。但你仍然需要处理这个例外;e、 在一个封闭的处理程序中。(在
    try
    和资源关闭中抛出异常时会发生有趣的事情;请参阅中的“抑制异常”部分。)

    您指的是哪个类的
    close()
    方法?查看代码会很有帮助,还有具体的异常。你能更具体地说你想关闭什么以及它属于哪个类吗?很多close()方法都是这样做的,这更像是一个抽象的问题,而不是特定于某些东西(例如:套接字、流、Jms、数据库结果集/组件),问题主要是关于对象设计和开发方法(但也许我只是累了)try with resources的一个主要特性是,只有当另一个异常挂起时,
    close
    期间发生的异常才会被抑制。在许多情况下,
    close
    在出现使用错误时抛出异常是适当且有帮助的(例如,如果使用事务包装器启动的任何事务在包装器关闭之前应该提交或回滚,那么尝试关闭而不提交或回滚抛出异常可能比静默回滚更有帮助,但是……如果事务期间发生的异常导致
    关闭在未请求提交或回滚的情况下发生,让
    close
    抛出异常(除了在资源尝试中使用时)会导致另一个异常丢失。当然,您是对的,但是在编写该结构时,如果文件在发出“开放供写”请求之前被锁定,则会感觉不对劲ed,这个请求应该是h
    try (Connection c1 = openConnection(); 
         Connection c2 = openConnection()) {
       // so stuff
    }