我正在通过阅读S G Ganesh和Tushar Sharma撰写的书来学习OCJP考试 . 在页346上有一个文字说:
如果您尝试更改throws子句怎么办?在重写方法中有许多方法可以更改throws子句,包括:a . 不提供任何抛出条款 . 湾列出要抛出的更多常规检查异常 . C . 除了基本方法中给定的已检查异常外,还列出了更多已检查的异常 . 如果您尝试这三种情况中的任何一种,您将收到编译器错误 . 例如,尽量不要在实现IntReader接口的类中的readIntFromFile()方法中提供throws子句 . public int readIntFromFile(){
扫描仪consoleScanner =新扫描仪(新文件(“integer.txt”));
return consoleScanner.nextInt();
}
您将收到此编译器错误:“未报告的异常FileNotFoundException;必须被捕获或声明被抛出 . “总而言之,基类方法的throws子句是它为该方法的调用者提供的 Contract :它表示调用者应该处理列出的异常或在其throws子句中声明这些异常 . 覆盖基本方法时,派生方法也应遵守该 Contract . 基本方法的调用者准备只处理基本方法中列出的异常,因此覆盖方法不能抛出更一般的或不是列出的已检查异常 . 但是,请注意,派生类方法的throws子句应遵循基本方法的throws子句的约定的讨论仅限于已检查的异常 . 与基类方法的throws子句相比,仍可以在 Contract 中添加或删除未经检查的异常 . 例如,请考虑以下内容:public int readIntFromFile()throws IOException,NoSuchElementException {
扫描仪consoleScanner =新扫描仪(新文件(“integer.txt”));
return consoleScanner.nextInt();
}
这是一个可接受的throws子句,因为可以从readIntFromFile()方法抛出NoSuchElementException . 此异常是未经检查的异常,当nextInt()方法无法从文件中读取整数时,它会被抛出 . 这是一种常见情况,例如,如果您有一个名为integer.txt的空文件;尝试从此文件中读取整数将导致此异常 .
我有点担心“a . ”这一点 . 它说如果你不提供任何throws子句,代码将无法编译 . 但是当我学习OCA时,我记得我读过你可以提供相同的throws子句,一个更具体的Exception或者没有throws子句,代码仍然会编译,这些只适用于Checked Exceptions . 我试过做一些测试,但我不能得到“未报告的异常FileNotFoundException;必须被抓或宣布被抛出 . “我记得我看过它,但我不知道在哪种情况下 .