Java异常和Catch子句

时间:2016-01-29 15:58:27

标签: java exception try-catch

以下是我为测试编写的一些简单代码 我知道我无法定义一个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();
    }
  }

}

代码编译得很好......怎么可能?

2 个答案:

答案 0 :(得分:2)

is.read()声明它会抛出IOExceptionInvalidClassException扩展IOException。因此,就您的代码所知,is.read()可能会抛出InvalidClassException。所以你可以尝试抓住它。

答案 1 :(得分:1)

InvalidClassExceptionIOException的子类型,可以通过InputStream#read()OutpuStream#write()方法抛出,因此try-catch块在此处有效。