以下是我为测试编写的一些简单代码 我知道我无法定义一个catch块来捕获一个检查异常,即try块中的代码没有声明要抛出(因为它包含无法访问的语句而且编译器不会让我)。
那么,这里到底发生了什么? (java.io.InvalidClassException是Exception的子类,因此它是一个经过检查的异常。)
import java.util.*;
import java.io.*;
class Test {
public void copy() {
try (InputStream is=new FileInputStream("file1");
OutputStream os=new FileOutputStream("file2");) {
byte[] buffer=new byte[1024];
int bytesRead=0;
while ((bytesRead=is.read(buffer)) != -1) {
os.write(buffer,0,bytesRead);
}
}
catch (java.io.InvalidClassException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
代码编译得很好......怎么可能?
答案 0 :(得分:2)
is.read()
声明它会抛出IOException
。 InvalidClassException
扩展IOException
。因此,就您的代码所知,is.read()
可能会抛出InvalidClassException
。所以你可以尝试抓住它。
答案 1 :(得分:1)
InvalidClassException
是IOException
的子类型,可以通过InputStream#read()
和OutpuStream#write()
方法抛出,因此try-catch块在此处有效。