Java throw和throws的用法(附带实例)
在 Java 中,方法可以声明可能会抛出的异常,或者使用 throws 关键字来指明方法可能会抛出哪些异常。这样做的目的是让调用者知道该方法可能会引发哪些异常,并强制调用者在调用该方法时对这些异常进行处理。
当一个方法使用 throws 声明了一个或多个异常时,调用该方法的代码必须采取以下两种方式之一:
语法结构如下:
举个简单的例子:
代码解释如下:
代码第 ① 处定义了名为 MyFileReader 的类,这个类将用于读取文件。它包含了一个 readFile() 方法,该方法声明了可能会抛出 FileNotFoundException 和 IOException 两种异常,见代码第 ② 处。
在 readFile() 方法中,首先声明了一个 java.io.FileReader 对象 fileReader 并初始化为 null,见代码第 ③ 处。
在 try 代码块中,通过 new java.io.FileReader(fileName) 实例化 fileReader 对象,打开指定文件 fileName 进行读取。
代码第 ④ 处使用 while 循环从文件中逐个字符读取数据,并将其转换成字符形式后输出到控制台。在 finally 代码块中,关闭 fileReader 对象以确保资源得到释放。无论是否发生异常,finally 代码块中的代码都会被执行。
代码第 ⑤ 处创建一个 MyFileReader 对象 myFileReader。
代码第 ⑥ 处指定要读取的文件名为“data/build.txt”。
要使用 throw 抛出异常,需要按照以下步骤进行:
下面是一个示例代码,演示如何使用 throw 显式抛出异常:
在 main() 方法中,调用 login() 方法,并传入用户名为 null 的情况。因为用户名为空,所以在 login() 方法内部会显式抛出 AuthenticationException 异常。在 catch 代码块中,捕获并处理这个异常,并输出异常消息和错误码。
当一个方法使用 throws 声明了一个或多个异常时,调用该方法的代码必须采取以下两种方式之一:
- 使用 try-catch 语句处理异常:在调用方法的地方使用 try-catch 语句来捕获和处理可能抛出的异常;
- 继续将异常抛出:在调用方法的地方使用 throws 关键字继续将异常传递给上层调用者,让上层调用者负责处理这些异常。
语法结构如下:
返回类型 方法名(参数列表) throws 异常类型1, 异常类型2, ... { // 方法的代码逻辑 // 可能会抛出声明的异常 }
举个简单的例子:
import java.io.FileNotFoundException; import java.io.IOException; class MyFileReader { // ① // 方法声明可能会抛出 FileNotFoundException 和 IOException 两种异常 public void readFile(String fileName) throws FileNotFoundException, IOException { // ② java.io.FileReader fileReader = null; try { // ③ fileReader = new java.io.FileReader(fileName); int data; while ((data = fileReader.read()) != -1) { // ④ System.out.print((char) data); } } finally { if (fileReader != null) { fileReader.close(); } } } } public class Main { public static void main(String[] args) { MyFileReader myFileReader = new MyFileReader(); // ⑤ String fileName = "data/build.txt"; // ⑥ try { // 调用 readFile() 方法,因为该方法声明了可能抛出异常,所以需要使用 try-catch 语句处理 myFileReader.readFile(fileName); } catch (FileNotFoundException e) { System.out.println("文件未找到:" + fileName); } catch (IOException e) { System.out.println("读取文件时发生 IO 异常:" + e.getMessage()); } } }上述代码成功地从“data/build.txt”文件中读取文本,并打印到控制台。
代码解释如下:
代码第 ① 处定义了名为 MyFileReader 的类,这个类将用于读取文件。它包含了一个 readFile() 方法,该方法声明了可能会抛出 FileNotFoundException 和 IOException 两种异常,见代码第 ② 处。
在 readFile() 方法中,首先声明了一个 java.io.FileReader 对象 fileReader 并初始化为 null,见代码第 ③ 处。
在 try 代码块中,通过 new java.io.FileReader(fileName) 实例化 fileReader 对象,打开指定文件 fileName 进行读取。
代码第 ④ 处使用 while 循环从文件中逐个字符读取数据,并将其转换成字符形式后输出到控制台。在 finally 代码块中,关闭 fileReader 对象以确保资源得到释放。无论是否发生异常,finally 代码块中的代码都会被执行。
代码第 ⑤ 处创建一个 MyFileReader 对象 myFileReader。
代码第 ⑥ 处指定要读取的文件名为“data/build.txt”。
Java throw关键字
在 Java 中,throw 关键字用于显式抛出异常。通过使用 throw 关键字,我们可以在代码中主动抛出异常,以便在特定情况下引发异常,并在调用方进行处理。要使用 throw 抛出异常,需要按照以下步骤进行:
- 创建一个异常对象,可以是现有的预定义异常类对象(如 NullPointerException、IllegalArgumentException 等),也可以是自定义的异常类对象。
- throw 关键字后跟要抛出的异常对象。
下面是一个示例代码,演示如何使用 throw 显式抛出异常:
class AuthenticationException extends Exception { // ... } public class Example { // 示例方法,演示如何显式抛出自定义的 AuthenticationException 异常 public void login(String username, String password) throws AuthenticationException { // 假设这里是进行用户登录验证的逻辑 if (username == null || password == null) { throw new AuthenticationException("用户名或密码不能为空", "ERROR001"); } // 其他验证逻辑... } public static void main(String[] args) { Example example = new Example(); String username = null; String password = "secret"; try { // 调用 login() 方法,如果用户名或密码为空,将会显式抛出 AuthenticationException 异常 example.login(username, password); } catch (AuthenticationException e) { System.out.println("捕获到自定义异常:" + e.getMessage()); System.out.println("错误码:" + e.getErrorCode()); } } }上述程序的运行结果如下:
捕获到自定义异常:用户名或密码不能为空
错误码:ERROR001
在 main() 方法中,调用 login() 方法,并传入用户名为 null 的情况。因为用户名为空,所以在 login() 方法内部会显式抛出 AuthenticationException 异常。在 catch 代码块中,捕获并处理这个异常,并输出异常消息和错误码。