首页 > 编程笔记 > Java笔记 阅读:21

Java throw和throws的用法(附带实例)

在 Java 中,方法可以声明可能会抛出的异常,或者使用 throws 关键字来指明方法可能会抛出哪些异常。这样做的目的是让调用者知道该方法可能会引发哪些异常,并强制调用者在调用该方法时对这些异常进行处理。

当一个方法使用 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 抛出异常,需要按照以下步骤进行:
  1. 创建一个异常对象,可以是现有的预定义异常类对象(如 NullPointerException、IllegalArgumentException 等),也可以是自定义的异常类对象。
  2. 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

在上述示例中,定义了一个名为 login 的方法,该方法用于用户登录验证。在这个方法中,首先检查用户名和密码是否为空,如果为空,就使用 throw 关键字显式抛出一个 AuthenticationException 异常,并提供异常消息:“用户名或密码不能为空”和错误码“ERROR001”。

在 main() 方法中,调用 login() 方法,并传入用户名为 null 的情况。因为用户名为空,所以在 login() 方法内部会显式抛出 AuthenticationException 异常。在 catch 代码块中,捕获并处理这个异常,并输出异常消息和错误码。

相关文章