什么会在 Java 中引发 IOException?
Posted
技术标签:
【中文标题】什么会在 Java 中引发 IOException?【英文标题】:What throws an IOException in Java? 【发布时间】:2012-10-24 08:19:23 【问题描述】:java.io.IOException
似乎是最常见的异常类型,巧合的是,它似乎也是最模棱两可的。
每当使用套接字、文件等进行编写时,我都会看到throws IOException
。然而,我实际上从来没有被解雇过,所以我想知道是什么应该引发异常。该文档在解释发生了什么方面不是很有帮助:
表示发生了某种 I/O 异常。此类是由失败或中断的 I/O 操作产生的一般异常类。
在哪些情况下会抛出 IOException,应该如何使用它?
【问题讨论】:
IOException
就是这样,输入或输出异常。当人们使用它们时,他们通常只是概括一个更具体的错误。 API 列出了 Java SE 6 中内置的所有不同类型的 IO 异常。
我知道 IOException 是什么,我只是想要一些能够更全面地描述它们何时发生的场景。
【参考方案1】:
假设你是:
-
读取网络文件并断开连接。
正在读取不再可用的本地文件。
使用某个流读取数据,而其他一些进程关闭了该流。
试图读/写文件,但没有权限。
尝试写入文件,但磁盘空间不再可用。
还有更多示例,但根据我的经验,这些是最常见的。
【讨论】:
对于数字 4,那么 SecurityException 是什么?【参考方案2】:一般来说,I/O 表示输入或输出。每当输入或输出操作失败或解释时,这些方法都会抛出IOException
。请注意,这不会因 读取或写入内存而抛出,因为 Java 会自动处理它。
下面是一些导致IOException
的情况。
【讨论】:
【参考方案3】:Java 文档有助于了解特定 IOException 的根本原因。
只需查看文档页面中IOException
的直接已知子接口:
ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, EOFException, FileLockInterruptionException, FileNotFoundException, FilerException, FileSystemException, HttpRetryException, IIOException, InterruptedByTimeoutException, InterruptedIOException, InvalidPropertiesFormatException, JMXProviderException, JMXServerErrorException, MalformedURLException, ObjectStreamException, ProtocolException, RemoteException, SaslException, SocketException, SSLException, SyncFailedException, UnknownHostException, UnknownServiceException, UnsupportedDataTypeException, UnsupportedEncodingException, UserPrincipalNotFoundException, UTFDataFormatException, ZipException
这些例外中的大多数都是不言自明的。
一些IOExceptions
的根本原因:
EOFException:表示输入期间意外到达文件结尾或流结尾。此异常主要由数据输入流使用,以发出流结束的信号。
SocketException:抛出表示创建或访问 Socket 时出错。
RemoteException:RemoteException 是在执行远程方法调用期间可能发生的许多与通信相关的异常的通用超类。远程接口(扩展 java.rmi.Remote 的接口)的每个方法都必须在其 throws 子句中列出 RemoteException。
UnknownHostException:抛出表示无法确定主机的IP地址(您可能没有连接到Internet)。
MalformedURLException:抛出表示出现了格式错误的 URL。在规范字符串中找不到合法协议,或者无法解析该字符串。
【讨论】:
以上是关于什么会在 Java 中引发 IOException?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个使用字符串连接的查询会在 SQL Server Compact Edition 中引发错误?
在 JPA 中,将 @ManyToOne 作为 @Id 会在执行 em.getReference() 时引发 ClassCastException