展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Java关键字throw、throws、Throwable怎么用

Java关键字throw、throws、Throwable怎么用

throw,意为“投掷、抛、扔”。Throw、Throws和Throwable三者都用于异常处理。1.ThrowableThrowable在Java中是异常处理这个分支的顶级父类,其它所有异常处理的实现都依赖于Throwable打开Java官方文档(Java8版本),找到Throwable,它的直接子类为Error和Exception。Error和Exception两者的特点在于Error异常程序无法处理,只能交由人工介入修改代码,比如栈溢出、堆溢出等等;而Exception异常可以提前发觉,并作出有效处

    throw,意为“投掷、抛、扔”。Throw、Throws和Throwable三者都用于异常处理。

    1. Throwable

    Throwable在Java中是异常处理这个分支的顶级父类,其它所有异常处理的实现都依赖于Throwable

    打开Java官方文档(Java8版本),找到Throwable,它的直接子类为Error和Exception。

    Java关键字throw、throws、Throwable怎么用

    Error和Exception两者的特点在于Error异常程序无法处理,只能交由人工介入修改代码,比如栈溢出、堆溢出等等;而Exception异常可以提前发觉,并作出有效处理。

    1.1 扩展-Error

    在Error中,常见的有栈溢出和堆溢出等等。

    Java关键字throw、throws、Throwable怎么用

    举个例子,StackOverflowError

    public class ErrorTest {
        public static void main(String[] args) {
            main(args);
        }
    }

    无限递归,执行这个程序就会报栈溢出异常。

    Java关键字throw、throws、Throwable怎么用

    再比如堆异常,OutOfMemoryError

    public class ErrorTest {
        public static void main(String[] args) {
            Integer[] testArray = new Integer[1024*1024*1024];
        }
    }

    Java关键字throw、throws、Throwable怎么用

    1.2 扩展-Exception

    在Exception中就有非常多我们所熟知的异常情况了,比如NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界)、NumberFormatException(数字格式化异常)等等。

    public class ExceptionTest {
        public static void main(String[] args) {
            int[] testArray = null;
            System.out.println(testArray[0]);  //空指针异常
        }
    }
    public class ExceptionTest {
        public static void main(String[] args) {
            int[] testArray = new int[3];
            System.out.println(testArray[3]);   //数组下标越界
        }
    }
    public class ExceptionTest {
        public static void main(String[] args) {
            String num = "abc";
            System.out.println(Integer.parseInt(num));    //数字格式化异常
        }
    }

    2. throws

    throws应用在方法声明处,指明此方法在执行时可能会出现的异常类型。一旦该方法执行时出现异常,就会在异常代码处生成一个异常类的对象,此对象满足Throws后的异常类型时,就会被抛出。这里有两个过程,代码有异常时

    1. 生成一个异常对象;

    2. throws捕获到这个异常,将异常对象抛出

    throws和try-catch-finally一起称为异常处理的两种方式。

    try-catch-finally是在出现异常时主动处理掉异常,使得程序可以继续执行下去;而throws捕获到异常之后向上抛出异常对象,不去真正地处理这个异常。

    所谓向上抛出异常对象,是将异常对象交给调用者去处理,比如方法A调用方法B,B通过throws抛出异常,而A可以选择使用try-catch-finally处理掉异常,也可以通过throws继续向上抛出异常对象,直到异常被真正处理掉。如果一直没有方法去处理异常,异常对象最终会被抛给JVM,从而导致程序停止运行。

    @Test
    public void throwsTest(){   //调用者解决抛出的异常
        try{
            formatChange("abc");
        }
        catch (NumberFormatException e){
            System.out.println("转换格式错误!");
        }
        catch (Exception e){
            System.out.println("出现错误");
        }
    }
    private int formatChange(String str) throws NumberFormatException{    //出现异常向上抛出
        return Integer.parseInt(str);
    }

    2.1 扩展

    ——如何选择try-catch-finally还是throws?

    当一个方法中存在异常需要处理,在大多数情况下,既可以选择try-catch-finally直接处理掉这个异常,也可以选择throws向上抛出异常,交给调用者去处理(异常抛到最后,总要有一方真正地去处理这个异常,怎么处理?还是用try-catch-finally呗),在选择上比较自由,但是,出现以下两种情况时,需要遵循一定的规则(如有补充,敬请指出)。

    • 如果父类中被重写的方法没有使用throws抛出异常,则子类重写的方法也不能使用throws抛出异常,也就意味着这种情况必须使用try-catch-finally去处理。

    • 在方法A中,先后调用了另外的几种方法,这几种方法是递进关系执行的且其中很多方法都存在异常需要处理,这种情况建议被调用的几个方法使用throws向上抛出异常,在方法A中,使用try-catch-finally统一处理掉这些异常。

    针对第一条,这是一个规定,子类中重写的方法使用throws抛出的异常必须不大于父类中被重写的方法抛出异常的范围。举个例子,父类中的方法B抛出NullPointerException异常,则子类中重写B方法就不能抛出如Exception这种比NullPointerException范围更大的异常;如果父类中被重写的方法没有抛出任何异常,则子类更不能抛出异常。

    为什么?展示一段代码。

    //假设父类中的方法B抛出NullPointerException异常,子类中的方法B可以抛出Exception
    private void test(ParentClassTest parent){
        try{
            parent.B();
        }
        catch(NullPointerException e){
            System.out.println("出现了空指针异常");
        }
    }

    在本示例中,假设父类中的方法B抛出NullPointerException异常,子类中重写的方法B可以抛出Exception。那么传进给test方法的参数如果是父类的实例化对象,那么调用test方法没有任何问题。如果传进的参数是子类的实例化对象,再去调用子类重写的方法B,那么就有可能抛出Exception异常,try-catch结构就压不住这个异常了,这显然是一个不合理的操作。

    针对第二条,假设方法A中调用了方法C、D、E,这三个方法都有可能产生异常,且存在递进关系,也就是D、E执行需要C执行完成、E执行依赖C、D执行完成。那么就推荐在C、D、E中向上抛出异常,在方法A中集中处理。为什么?如果C、D、E都是向上抛出异常,而A使用try-catch-finally去处理这个异常,如果某个方法真的出现异常,则不再继续执行。而如果C、D、E都使用try-catch-finally直接解决掉异常,那么即使产生了异常,方法A也不会接收到异常的产生,那么还会接着往下执行,但是C出现了异常,再执行D、E没有任何意义。

    3. throw

    如果在程序编写时有手动抛出异常的需求,则可以使用throw

    throw使用在方法体内。与try-catch-finally和throws都不同,异常处理的两个阶段:1.遇到异常,生成异常对象;2.捕获到异常,进行抛出或处理。try-catch-finally和throws都处在第二个阶段,都是捕获到异常后的相关处理,一般使用系统根据异常类型自动生成的异常对象进行处理。而throw应用在第一阶段,手动地产生一个异常对象。

    举一个例子,判断一个数值是否为非负数,如果为负数,则抛出异常。

    class ThrowTest{
        private int Number;
        public void judge(int num){
            if(num>=0){
                this.Number = num;
            }
            else{
                throw new RuntimeException("传入参数为负数");
            }
        }
    }
    @Test
    public void test2(){
        ThrowTest throwTest = new ThrowTest();
        throwTest.judge(-100);
    }

    成功抛出异常。

    Java关键字throw、throws、Throwable怎么用

    使用try-catch捕获一下异常。

    @Test
    public void test2(){
        ThrowTest throwTest = new ThrowTest();
        try{
            throwTest.judge(-100);
        }
        catch (RuntimeException e){
            System.out.println(e.getMessage());
        }
    }

    Java关键字throw、throws、Throwable怎么用

    如果把throw抛出的异常改为Exception,则直接报错,也就是不能编译。Exception包含两种异常:编译时异常和运行时异常,前者在编译前就要检查是否有可能产生编译时异常;后者是在编译后运行时才会判断的异常。而throw new Exception包含了编译时异常,需要显式处理掉这个异常,怎么处理?try-catch-finally或者throws

    Java关键字throw、throws、Throwable怎么用

    class ThrowTest{
        private int Number;
        public void judge(int num) throws Exception{
            if(num>=0){
                this.Number = num;
            }
            else{
                throw new Exception("传入参数为负数");
            }
        }
    }

    调用方也要随着进行更改。

    @Test
    public void test2(){
        ThrowTest throwTest = new ThrowTest();
        try{
            throwTest.judge(-100);
        }
        catch (RuntimeException e){
            System.out.println(e.getMessage());
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }

    Java关键字throw、throws、Throwable怎么用

    3.1 扩展

    ——自定义异常类

    throw还可以抛出自定义异常类。

    自定义异常类的声明需要继承于现有的异常体系。

    class MyException extends RuntimeException{
        static final long serialVersionUID = -703489719076939L;   //可以认为是一种标识
        public MyException(){}
        public MyException(String message){
            super(message);
        }
    }

    此时我们可以抛出自定义的异常

    class ThrowTest{
        private int Number;
        public void judge(int num) throws MyException{
            if(num>=0){
                this.Number = num;
            }
            else{
                throw new MyException("不能输入负数");
            }
        }
    }

    调用者修改

    @Test
    public void test2(){
        ThrowTest throwTest = new ThrowTest();
        try{
            throwTest.judge(-100);
        }
        catch (MyException e){
            System.out.println(e.getMessage());
        }
    }

    Java关键字throw、throws、Throwable怎么用

    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    编程开发 Java
    相关文章 更多
    精品专题 更多
    本月促销

    正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    灵活计算器
    灵活计算器

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    图几
    图几

    图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

    密码键盘
    密码键盘

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

    思源笔记
    思源笔记

    思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    Office 365 简体中文
    Office 365 简体中文

    一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

    WALTR PRO
    WALTR PRO

    WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    CodeExpander
    CodeExpander

    CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

    Mountain Duck
    Mountain Duck

    Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

    Menuist
    Menuist

    Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

    Mole
    Mole

    Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

    WINDOWS 更多
    Windows 10
    Windows 10

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

    思源笔记
    思源笔记

    思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    傲梅轻松备份
    傲梅轻松备份

    傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

    Office 365 简体中文
    Office 365 简体中文

    一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

    Wise Folder Hider Pro
    Wise Folder Hider Pro

    Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

    WALTR PRO
    WALTR PRO

    WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    CodeExpander
    CodeExpander

    CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

    PinStack
    PinStack

    PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    Mountain Duck
    Mountain Duck

    Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

    Seer
    Seer

    Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。