首页 > 其他分享 >异常处理全面解析

异常处理全面解析

时间:2024-07-13 23:32:58浏览次数:10  
标签:catch Exception try Test 全面 解析 异常 throws

checked和unchecked异常

  • checked 异常(检查型异常)在源代码里必须显式地捕获或者抛出,否则编译器会提示你进行相应的操作;而 unchecked 异常(非检查型异常)就是所谓的运行时异常,通常是可以通过编码进行规避的,并不需要显式地捕获或者抛出。

  • NoClassDefFoundError:程序在编译时可以找到所依赖的类,但是在运行时找不到指定的类文件,导致抛出该错误;原因可能是 jar 包缺失或者调用了初始化失败的类。

  • ClassNotFoundException:当动态加载 Class 对象的时候找不到对应的类时抛出该异常;原因可能是要加载的类不存在或者类名写错了。

throw和throws

1)throws关键字用于声明异常,它的作用和try-catch相似;而throw关键字用于显式的抛出异常。

throws ArithmeticException;

2)throws关键字后面跟的是异常的名字;而throw关键字后面跟的是异常的对象。

throw new ArithmeticException("算术异常");

3)throws关键字出现在方法签名上,而throw关键字出现在方法体里。

4)throws关键字在声明异常的时候可以跟多个,用逗号隔开;而throw关键字每次只能抛出一个异常。

  • 如果有好几个类似的方法都可能出现异常,如果为每个方法都加上try-catch,就会显得非常繁琐。一个解决办法就是,使用throws关键字,在方法签名上声明可能会抛出的异常,然后在调用该方法的地方使用try-catch进行处理。
public static void main(String args[]){
    try {
        myMethod1();
    } catch (ArithmeticException e) {
        // 算术异常
    } catch (NullPointerException e) {
        // 空指针异常
    }
}
public static void myMethod1() throws ArithmeticException, NullPointerException{
    // 方法签名上声明异常
}

try-catch-finally

  • 一个 try 块后面可以跟多个 catch 块,用来捕获不同类型的异常并做相应的处理,当 try 块中的某一行代码发生异常时,之后的代码就不再执行,而是会跳转到异常对应的 catch 块中执行。

  • 如果一个 try 块后面跟了多个与之关联的 catch 块,那么应该把特定的异常放在前面,通用型的异常放在后面,不然编译器会提示错误。

  • finally 块前面必须有 try 块,不要把 finally 块单独拉出来使用。编译器也不允许这样做。

  • finally 块不是必选项,有 try 块的时候不一定要有 finally 块。

  • 如果 finally 块中的代码可能会发生异常,也应该使用 try-catch 进行包裹。

  • 即便是 try 块中执行了 return、break、continue 这些跳转语句,finally 块也会被执行

  • 不执行finally的情况:遇到了死循环;执行了 System. exit() 这行代码。

class MyFinallyReadLineThrow {
    public void close() throws Exception {
        throw new Exception("close");
    }

    public void readLine() throws Exception {
        throw new Exception("readLine");
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        MyFinallyReadLineThrow myThrow = null;
        try {
            myThrow = new MyFinallyReadLineThrow();
            // readLine的异常信息丢失
            myThrow.readLine();
        } finally {
            myThrow.close();
        }
        /*
        Exception in thread "main" java.lang.Exception: close
            at test.ExceptionTest.MyFinallyReadLineThrow.close(Test.java:5)
            at test.ExceptionTest.Test.main(Test.java:21)
         */
    }
}

try-with-resources

  • 当一个异常被抛出的时候,可能有其他异常因为该异常而被抑制住,从而无法正常抛出。这时可以通过 addSuppressed() 方法把这些被抑制的方法记录下来,然后被抑制的异常就会出现在抛出的异常的堆栈信息中,可以通过 getSuppressed() 方法来获取这些异常。这样做的好处是不会丢失任何异常,方便我们进行调试。
package test.ExceptionTest;

class MyFinallyReadLineThrow implements AutoCloseable {
    @Override
    public void close() throws Exception {
        throw new Exception("close");
    }

    public void readLine() throws Exception {
        throw new Exception("readLine");
    }
}


public class Test {
    public static void main(String[] args) {
        try (MyFinallyReadLineThrow myThrow = new MyFinallyReadLineThrow()) {
            myThrow.readLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*
        java.lang.Exception: readLine
            at test.ExceptionTest.MyFinallyReadLineThrow.readLine(Test.java:10)
            at test.ExceptionTest.Test.main(Test.java:18)
            Suppressed: java.lang.Exception: close
               at test.ExceptionTest.MyFinallyReadLineThrow.close(Test.java:6)
               at test.ExceptionTest.Test.main(Test.java:19)
         */
    }
}

标签:catch,Exception,try,Test,全面,解析,异常,throws
From: https://www.cnblogs.com/sprinining/p/18300977

相关文章

  • SpringMVC异常处理器,通过注解方式配置
    SpringMVC在处理器方法执行过程中出现了异常,可以采用异常处理器进行应对。一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转到对应的视图,在视图上展示友好信息。配置ExceptionControllerpackagecom.powernode.springmvc.controller;importorg.springframewo......
  • 反射DLL注入原理解析
    反射DLL注入又称RDI,与常规DLL注入不同的是,它不需要LoadLibrary这个函数来加载dll,而是通过DLL内部的一个函数来自己把自己加载起来,这么说可能会有一点抽象,总之这个函数会负责解析DLL文件的头信息、导入函数的地址、处理重定位等初始化操作,先不用理解这个函数是怎么实现的......
  • 测试驱动开发的艺术:Xcode中实现TDD的全面指南
    测试驱动开发的艺术:Xcode中实现TDD的全面指南在软件开发过程中,测试驱动开发(Test-DrivenDevelopment,TDD)是一种以测试为先导的开发模式,它强调先编写测试用例,再编写功能代码,从而确保代码的质量和可维护性。Xcode作为苹果官方的集成开发环境(IDE),提供了强大的工具和框架来支持TD......
  • 解决HBuilder X运行微信小程序模拟器Error: pages.json解析失败
    前言如果已经排查很久了,那这就不是你的问题了,大概率是由于你曾经创建了一个路径,在指定PagePath的时候又指向了这个路径,这个操作本身没有问题。但是,如果你曾经对这个路径修改过了,那编译器就会有问题,来品鉴一下这个错误。16:15:36.772请注意运行模式下,因日志输出、sourcem......
  • java异常分类和处理方式
    异常的概念首先,java中的异常是以类的形式存在的,也就是说,每一种异常实际上都是一种特殊的类。这里根据百度开发者社区的定义可以验证:Java异常体系主要由Throwable类及其子类构成。Throwable是所有错误和异常的超类,它有两个直接子类:Error和Exception。(其实不严格的来说有三......
  • 深入解析 Vue Router:构建单页面应用的利器
    Vue.js是一个渐进式JavaScript框架,常用于构建用户界面。随着应用的复杂度增加,路由(Routing)变得越来越重要,这就是VueRouter的用武之地。VueRouter是官方提供的Vue.js路由管理器,用于创建单页面应用(SPA)。本文将详细介绍VueRouter的基本概念和使用方法,帮助你更好地构建和......
  • 智慧水利解决方案:从理论到实践的全面跨越,展示其在水资源管理、水灾害预警、水生态保护
    目录一、引言:智慧水利的时代背景与意义二、智慧水利的理论框架与技术体系1、理论框架2、技术体系三、智慧水利在水资源管理中的应用1、水资源优化配置2、水量水质协同管理四、智慧水利在水灾害预警中的应用1、洪水预警与应急响应2、干旱监测与评估五、智慧水利在水......
  • Java异常详解及自定义异常
    认识异常,掌握异常处理主要的5个关键字:throw、try、catch、final、throws并掌握自定义异常目录1、异常概念与体系结构1、1异常的概念1、2异常体系结构 1、3异常的分类编译时异常:运行时异常:2、异常处理 2、1防御式编程2、2异常的抛出2.3异常的捕获2.3.1异常声......
  • 【带你全面了解 RAG,深入探讨其核心范式、关键技术及未来趋势】
    文末有福利!大型语言模型(LLMs)已经成为我们生活和工作的一部分,它们以惊人的多功能性和智能化改变了我们与信息的互动方式。然而,尽管它们的能力令人印象深刻,但它们并非无懈可击。这些模型可能会产生误导性的“幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的......
  • [Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18299911出自【进步*于辰的博客】参考笔记一,P35.4/5。目录1、介绍2、try...with...resources最后1、介绍相信大家对try...catch...finally都很熟悉了,在此我提一点使用细......