2

我正在尝试在某些客户端/服务器代码中追踪 an 的来源EOFException,但是许多使用的类只有方法说它们抛出一个IOException,而不是具体的一个EOFException. 通常我只会查看堆栈跟踪,但我没有它并且无法重现它。因此,列出具有专门抛出的方法的每个类的列表会很有帮助EOFException,但我不知道如何找出这些信息。

是否有关于每个(标准)Java 类(在我的情况下是 SE 7)的信息来源,这些类具有 throw 的方法EOFException?我尝试阅读 JavadocsEOFException无济于事。

(我发现,至少,DataInput确实提到了EOFException。但是还有更多吗?)

后记:由于似乎唯一的方法是检查源代码,EOFException是我在提取的源代码(1.7.0_45)中搜索“”的结果。

4

2 回答 2

3

编辑: 在底部为 JDK 中的所有源代码添加了 7.51 的结果。

在 Java 6.17 中,这里是所有显式 throw 的类java.io.EOFExceptionnew\s+EOFException具体来说,它是在每个源代码文件中找到的次数。

java.io.DataInputStream.java: 8
java.io.ObjectInputStream.java: 6
java.io.RandomAccessFile.java: 8
java.util.zip.GZIPInputStream.java: 2
java.util.zip.InflaterInputStream.java: 1
java.util.zip.ZipFile.java: 1
java.util.zip.ZipInputStream.java: 1

这是另一条信息:所有源代码文件包含catch\s*\(\s*EOFException

java.io.ObjectInputStream.java: 1
java.util.zip.ZipInputStream.java: 1

请注意,没有java.*扩展的标准异常类EOFException(没有出现

extends\s+([a-z]+\.)*EOFException

java.*源代码中的任何位置)。

这是一个有限但有价值的起点。正如其他人所提到的,这可能会遗漏一些情况——当你只有源代码来工作时,找到它们会很耗时。希望这些信息能让您走上正确的道路。


以下是 Java 7.51 的结果,适用于 JDK 提供的所有源代码:

extends\s+([a-z]+\.)*EOFException

没有任何

catch\s*\(\s*EOFException

com.sun.imageio.plugins.gif.GIFImageReader: 1
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl: 1
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl: 4
com.sun.org.apache.xerces.internal.impl.XMLVersionDetector: 1
com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDLoader: 2
java.io.ObjectInputStream: 1
java.util.zip.ZipInputStream: 1

new\s+EOFException

com.sun.corba.se.impl.io.IIOPInputStream: 1
com.sun.imageio.plugins.png.PNGImageReader: 1
com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl: 1
com.sun.org.apache.xerces.internal.impl.XMLEntityManager: 1
com.sun.org.apache.xerces.internal.impl.XMLEntityScanner: 1
java.io.DataInputStream: 8
java.io.ObjectInputStream: 6
java.io.RandomAccessFile: 8
java.util.zip.GZIPInputStream: 2
java.util.zip.InflaterInputStream: 1
java.util.zip.ZipFile: 1
java.util.zip.ZipInputStream: 1
javax.imageio.stream.ImageInputStreamImpl: 8
于 2014-01-30T14:02:45.557 回答
1

只有在代码创建并立即抛出 EOFException 的假设下,您才能发现这一点。但以下情况也可能引发 EOFException:

class Foo {
    ...
    public void iAmHarmless(Exception x) { if (x != null) throw x; }
    ...
 }

或者如何使用以下方法来击败 aliteralminds 方法:

 class XYException extends EOFException { ... }
 class Foo {
     public void surprise() { throw new XYException().super(); }
 }

开个玩笑——许多类的方法可能仅仅因为继承而抛出 EOFException 。“EOFException”的 grep 只给出了非常基类。但是您必须考虑其所有子类。例子:java.util.jar.JarInputStream

于 2014-01-30T14:10:24.520 回答