Java—异常(Exception)_java exception-程序员宅基地

技术标签: 笔记  java  

目录

一、基本介绍

异常类层次结构图

常见的运行时异常

二、异常处理

三、try-catch异常处理

四、thorws异常处理

五、自定义异常

六、throw和throws的区别


一、基本介绍

  • 基本概念

        Java语言中,将程序执行中发生的不正常情况称为“ 异常 ”。(开发过程中的语法错误和逻辑错误不是异常)

  • 执行过程中所发生的异常事件可分为两大类

        1.Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out of memory),Error是严重错误,程序会崩溃

        2.Exception:其它因编译错误和偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常[程序运行时发生的异常]和编译时异常[编程时编译器检查出的异常]

异常类层次结构图

 异常体系图小结:

1.异常分为两大类,运行时异常和编译时异常

2.运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常

3.对于运行时异常可以不做处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响

4.编译时异常是编译器要求必须处置的异常

常见的运行时异常

1. NullPointerException 空指针异常

        当应用程序试图在需要对象的地方使用null时,会抛出此异常

2. ArithmeticException 数学运算异常

        当出现异常的运算条件时,会抛出此异常

3. ArrayIndexOutOfBoundsException 数组下标越界异常

        用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引

4. ClassCastException 类型转换异常

        当试图将对象强制转换为不是实例的子类时,会抛出此异常

5. NumberFormatException 数字格式不正确异常

        当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式,会抛出此异常—>使用异常我们可以确保输入是满足条件数字

二、异常处理

  • 基本介绍

        异常处理就是当异常发生时,对异常处理的方式

  • 异常处理的方式

        1. try—catch—finally :程序员在代码中捕获发生的异常,自行处理

        2. throws :将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

 

三、try-catch异常处理

        1.Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try...catch块

        2.基本语法

try{

    //可疑代码

    //将异常生成对应的异常对象,传递给catch块

}catch{

    //对异常的处理

}

//如果没有finally,语法也可以通过

        3. try-catch方式处理异常注意事项

        ①如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

        ②如果异常没有发生,则顺序执行try的代码块,不会进入到catch

        ③如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用代码 -finally{ }

try{

    //可疑代码

}catch(异常){

    //....

}finally{

    //释放资源等..

}

        4.可以有多个catch语句捕获不同的异常(进行不同的业务处理),要求子类异常写在前面,父类异常写在后面,比如(NullPointerException在前,Exception在后),如果发生异常,只会匹配一个catch

        5.可以进行try-finally配合使用,这种用法相当于没有捕获异常,依次程序会直接崩掉/退出。应用场景就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑

try-catch-finally执行顺序小结

1.如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

2.如果出现异常,则try块中异常发生后,try块剩下的语句不会再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里的语句

public class TryCatchDetail {
    public static void main(String[] args) {

        //快捷键ctrl + alt + t
        //解读
        //1.如果发生异常,则异常后面的代码块不会执行,直接进入到catch块
        //2.如果异常没有发生,则顺序执行try的代码块,不会进入到catch
        //3.如果希望不管是否发生异常,都执行某段代码块(比如关闭连接,释放资源等)则使用代码— finally
        try {
            String str = "123";
            int a = Integer.parseInt(str);
            System.out.println("数字:" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        }finally{
            System.out.println("finally代码块被执行...");
        }
        System.out.println("程序继续执行...");
    }
}





public class TryCatchDetail02 {
    public static void main(String[] args) {

        //解读
        //1.如果try代码块可能有多个异常
        //2.可以使用多个catch分别捕获不同的异常,相应处理
        //3.要求子类异常写在前面,父类异常写在后面
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2;//ArithmeticException
        }catch (NullPointerException e) {
            System.out.println("空指针异常=" + e.getMessage());
        }catch(ArithmeticException e) {
            System.out.println("算数异常=" + e.getMessage());
        }catch (Exception e) {
            System.out.println("异常信息=" + e.getMessage());
        }finally {

        }
    }
}
class Person {

    private String name;

    public String getName() {
        return name;
    }
}





public class TryCatchDetail03 {
    public static void main(String[] args) {
        /*
        可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。
        应用场景就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
         */
        try{
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        }finally {
            System.out.println("执行了finally...");
        }
        System.out.println("程序继续执行...");
    }
}

四、thorws异常处理

  • 基本介绍

        1.如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理

        2.在方法生命中用throws语句可以声明抛出异常的列表,thros后面的异常类型可以是方法中产生的异常类型,也可以是它的父类

  • 注意事项和使用细节

        1.对于编译异常,程序中必须处理,比如try-catch或者throws

        2.对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

        3.子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的子类型

        4.在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws

五、自定义异常

  • 基本概念

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息

  • 自定义异常的步骤

1.定义类:自定义异常类名继承Exception或RuntimeException

2.如果继承Exception,属于编译异常

3.如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)

六、throw和throws的区别

意义 位置 后面跟的东西
throws 异常处理的一种方式 方法声明处 异常类型
throw 手动生成异常对象的关键字 方法体中 异常对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_61843013/article/details/123305924

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文