Java throws子句示例

时间:2020-01-09 10:34:56  来源:igfitidea点击:

方法中的代码可能会引发方法无法处理的异常。在这种情况下,我们需要指定这些异常以及方法声明。这样,调用方法可以为那些异常提供异常处理机制。要在方法声明中指定异常,可以在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子句声明它们不是强制性的。