Java throws子句示例
方法中的代码可能会引发方法无法处理的异常。在这种情况下,我们需要指定这些异常以及方法声明。这样,调用方法可以为那些异常提供异常处理机制。要在方法声明中指定异常,可以在Java中使用throws关键字。
Java中throws关键字的一般形式
type methodName(parameters) throws exception1, excpetion2...{ ... ... }
尝试捕获块或者引发
我们可以通过提供try-catch块来处理方法中引发的方法代码中的异常。如果要将其委托给调用方方法以提供异常处理机制,则可以使用Java中的throws声明异常。然后,提供异常处理机制是调用方法的责任。当然,调用者方法也可以使用throws关键字声明异常,并将其委托给堆栈中的下一个方法进行处理。
根据异常处理的最佳实践,我们应始终提早抛出并迟到。因此,建议使用throws子句以便及时捕获。
检查异常和抛出子句
如果方法中没有处理异常,则必须在方法声明中使用throws子句指定所有检查的异常。否则会导致编译时错误。
对于未经检查的异常,在throws子句中指定它们是可选的。如果我们未使用throws子句指定未经检查的异常,则不会有任何编译时错误。
抛出异常时的示例代码未与Checked异常一起使用
在代码中,既没有try-catch块来处理异常,也没有throws子句来指定异常,因此,由于FileNotFoundException是已检查的异常,因此编译时错误。
throws子句Java示例
上面的代码可以如下编写以使用throws子句。
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class ThrowsDemo { public static void main(String[] args) { ThrowsDemo td = new ThrowsDemo(); try { td.readFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void readFile() throws IOException{ BufferedReader br = null; try{ br = new BufferedReader(new InputStreamReader(new FileInputStream( new File("D:\test1.txt")))); }finally{ br.close(); } } }
在上面的代码中,我们可以看到try-finally仍被使用,因为在finally块中关闭了资源。在这里,readFile()方法在尝试打开文件时可以抛出两个检查到的异常FileNotFoundException,而在试图关闭finally块中的BufferedReader时可以抛出IOException。不是提供try-catch块来处理那些异常,而是使用throws子句来声明抛出的异常。请注意,IOException是FileNotFoundException的父类,因此我们只能声明IOException来处理这两个异常。
重要事项
- 使用throws子句,可以在方法声明中指定方法代码引发的异常。
- 抛出Java异常处理将异常处理的职责委托给调用方方法。
- 对于检查的异常,必须提供try-catch块来处理该异常,或者使用throws对其进行声明。否则会导致编译时错误。
- 对于未检查的异常,使用throws子句声明它们不是强制性的。