Java中throws 与 throw 的区别与用法示例详解

 更新时间:2025年09月06日 09:42:46   作者:菜鸟不学编程  
本文给大家介绍Java中throws与throw的区别与用法示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、先看最短总结

关键字作用出现位置常用于
throw抛出一个异常对象(实际动作)方法体内部立即抛出某个异常
throws声明方法可能抛出的异常类型(承诺/说明)方法声明处告诉调用者“我可能抛异常”

一句话记忆:

throw 是“扔出异常”,throws 是“声明可能会扔异常”。

二、throw:真正“扔出”异常

throw 用于在方法内部创建并抛出一个异常对象,程序执行到 throw 就会立刻中断,并把异常抛给调用者,或者被当前方法内部的 try-catch 捕获。

语法:

throw new 异常类型("异常信息");

示例 1:手动抛出异常

public class ThrowExample {
    public static void main(String[] args) {
        int age = -5;
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能为负数!");
        }
        System.out.println("年龄是:" + age);
    }
}

输出:

Exception in thread "main" java.lang.IllegalArgumentException: 年龄不能为负数!
    at ThrowExample.main(ThrowExample.java:5)

解释:

  • throw 立刻抛出一个异常对象。
  • 后续代码不会执行。

示例 2:配合 try-catch 捕获异常

public class ThrowExample {
    public static void main(String[] args) {
        try {
            checkAge(-5);
        } catch (IllegalArgumentException e) {
            System.out.println("捕获到异常:" + e.getMessage());
        }
    }
    public static void checkAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能为负数!");
        }
        System.out.println("年龄是:" + age);
    }
}

输出:

捕获到异常:年龄不能为负数!

🎯 要点:

  • throw 后面是一个异常对象。
  • 一旦执行 throw,程序会跳出当前方法,除非被 try-catch 捕获。

三、throws:声明可能抛出的异常

throws 并不真正抛出异常,而是用于声明“我这个方法 可能 抛出某种异常”,提醒调用者必须关注这个异常。

语法:

修饰符 返回值类型 方法名(参数列表) throws 异常类型1, 异常类型2, ... {
    // 方法体
}

示例:声明方法可能抛异常

比如读文件时,FileReader 的构造方法可能抛 FileNotFoundException,你就必须用 throws 声明:

import java.io.FileReader;
import java.io.FileNotFoundException;
public class ThrowsExample {
    public static void main(String[] args) {
        try {
            readFile("test.txt");
        } catch (FileNotFoundException e) {
            System.out.println("捕获到异常:" + e.getMessage());
        }
    }
    public static void readFile(String path) throws FileNotFoundException {
        FileReader fr = new FileReader(path);
        System.out.println("文件读取成功!");
    }
}

如果不写 try-catch,而又不在方法签名里写 throws,编译器会报错。

🎯 要点:

  • throws 出现在方法声明处,表示 可能 抛出的异常类型。
  • 调用方要么:
    • try-catch 捕获;
    • 或者继续在自己的方法上声明 throws

四、throw 和 throws 的区别

比较throwthrows
位置方法体内方法声明处
作用真正抛出异常声明可能会抛异常
后面跟异常对象异常类型(类名)
数量一次只能抛一个异常对象可声明多个异常类型,用逗号分隔
是否是执行动作否,仅声明

五、Checked 与 Unchecked 异常与 throws 的关系

Java 异常分两类:

  • Checked Exception(受检异常)
    • 编译器检查
    • 必须用 try-catch 或 throws
    • 如:IOException, SQLException
  • Unchecked Exception(运行时异常)
    • 编译器不会强制检查
    • 不一定需要写 throws
    • 如:NullPointerException, IllegalArgumentException

⚠️ throws 主要用于声明 Checked Exception。

示例:throws 通常声明 Checked Exception

public void readData() throws IOException {
    // code that may throw IOException
}

而对于 RuntimeException(Unchecked),一般不用写 throws:

public void divide(int a, int b) {
    if (b == 0) {
        throw new ArithmeticException("除数不能为零!");
    }
}

六、经典面试题

throw 和 throws 有什么区别?

简答:

throw 用于方法体内,真正抛出异常对象;
throws 用于方法声明处,表示该方法可能抛出哪些异常类型,提醒调用者处理。

✅ 重点记忆

  • throw:方法内部,真正扔出一个异常对象
  • throws:方法声明处,告诉外部“我可能会扔异常”
  • Checked Exception → 必须 throws 或 try-catch
  • Unchecked Exception → 可写 throw,不一定写 throws

这样,你是不是对 throwthrows 一下就清楚了呢?😎

到此这篇关于Java中throws 与 throw 的区别与用法示例详解的文章就介绍到这了,更多相关java throws 与 throw 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    这篇文章主要介绍了浅谈Java中的重载,重写,多态,静态绑定、动态绑定,具有一定借鉴价值
    2018-01-01
  • 详解RabbitMQ核心机制

    详解RabbitMQ核心机制

    MQ 主要用于分布式系统之间的通信,解决数据传递的效率和可靠性问题,本文给大家介绍RabbitMQ核心机制,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • SpringBoot使用@Cacheable注解实现缓存功能流程详解

    SpringBoot使用@Cacheable注解实现缓存功能流程详解

    最近一直再学Spring Boot,在学习的过程中也有过很多疑问。为了解答自己的疑惑,也在网上查了一些资料,以下是对@Cacheable注解的一些理解
    2023-01-01
  • javaSystem.out.println()输出byte[]、char[]异常的问题详析

    javaSystem.out.println()输出byte[]、char[]异常的问题详析

    这篇文章主要给大家介绍了关于javaSystem.out.println()输出byte[]、char[]异常问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看啊
    2019-01-01
  • java.lang.IncompatibleClassChangeError异常的问题解决

    java.lang.IncompatibleClassChangeError异常的问题解决

    本文主要介绍了java.lang.IncompatibleClassChangeError异常的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java输入输出流实例详解

    Java输入输出流实例详解

    这篇文章主要介绍了Java输入输出流,结合实例形式详细分析了Java常见的输入输出常用操作技巧与相关注意事项,需要的朋友可以参考下
    2018-09-09
  • java使用Jsoup组件生成word文档

    java使用Jsoup组件生成word文档

    java使用Jsoup组件生成word文档的方法
    2013-11-11
  • spring boot activiti工作流的搭建与简单使用

    spring boot activiti工作流的搭建与简单使用

    这篇文章主要给大家介绍了关于spring boot activiti工作流的搭建与简单使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 深入探究SpringBoot中的Sleuth用法

    深入探究SpringBoot中的Sleuth用法

    Sleuth是一个分布式跟踪系统,用于跟踪应用程序中的请求和操作,在本文中,我们将探讨SpringBoot中的Sleuth是什么,以及如何使用它来跟踪应用程序中的请求和操作,感兴趣的小伙伴跟着小编一起来探讨吧
    2023-07-07
  • 使用Java实现将一个正整数分解质因数

    使用Java实现将一个正整数分解质因数

    这篇文章主要介绍了如何使用Java语言实现将一个正整数分解为质因数的功能,首先,我们定义了一个正整数并调用一个方法来输出其质因数分解结果,需要的朋友可以参考下
    2026-01-01

最新评论