热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java异常机制分类_Java异常机制

前言:写了两周的博客了,深的浅的都有,总有人问我写博客有什么用?能出书吗?写的太浅有人看吗?对找

前言:

写了两周的博客了,深的浅的都有,总有人问我写博客有什么用?能出书吗?写的太浅有人看吗?对找工作有什么帮助吗?不想争辩,也不愿把自己说的多么高大上,分享本身是一件简单的小事,但是能给我带来快乐,我享受别人看过我博客之后有种觉得有收获那种感觉,就这么简单。还有那些害怕写博客被别人质疑太浅的,其实大可不必,总有一些人掌握的知识没有你多,也许你的一句话就解决了他们的疑问。言归正传,今天给大家带来Java异常体系。

1、Java异常体系结构图

d82fe75ee01d

继承Exception的异常

d82fe75ee01d

继承RuntimeException的异常

然后:继承Exception的异常应该出现在这种情况里,即我的代码极有可能出现这种异常,因为我无法考虑到所有环境,因此我抛出给调用方根据自己的环境进行对应处理。继承RuntimeException的异常应该出现在此种环境里,即我的代码出现这种异常的可能性不是特别大,但是还是有出现的可能,而在出现这种异常的时候我能够给调用方以足够的提示信息告知他发生了什么。

3、异常捕获机制

3.1、catch捕获范围

从第一个catch开始到最后一个catch形成捕获队列,按照队列的顺序谁先捕获到就归谁处理。这个过程要考虑多态的问题,由于Exception是许多异常类的父类,因而如果处在队列前面,后面的队列的声明就没有意义了。

public static int bMethod() {

try {

return cMethod(true);

} catch (EException e) { //第一个捕获

e.printStackTrace();

} catch (Exception e) { //第一个没捕获到,第二个来捕获

e.printStackTrace();

} finally {

return 1;

}

}

3.2、finally的执行问题

finally的中文意思是最终,也就是段try catch finally代码的try catch该执行的都执行完之后最终要执行finally里的代码。简单起见可以把try catch finally看成一个代码块。

为了更好的解释finally运行机制,我们先了解一下虚拟机栈帧。

d82fe75ee01d

虚拟机栈帧

我们知道,每个线程都有一个自己的栈空间,实际上,当方法执行的时候JVM会把方法制作成栈帧压入到操作栈中,每个方法都对应着一个栈帧,当前执行的栈帧总是位于栈顶。

栈帧包含局部变量表、操作数栈、动态连接、方法返回地址。这里的方法返回地址实际上是在方法遇到ret指令之后返回值存放的位置的地址,也就是说返回值并没有直接返回给方法的调用者,而是中间又多了一步将返回值存放到栈的某一个位置。在真正把返回值交给上层调用者之前,如果遇到break、continue、return、抛出异常等情况JVM会清除栈中的返回值

例子1,返回100

public static int method1() {

int k = 0;

try {

k = 1;

//返回的k=1首先存储到栈中的返回值位置,如果顺利完成就把该位置的值返回,如果遇到特殊指令如break、continue、return、抛异常就清除

return k;

} catch (Exception e) {

e.printStackTrace();

} finally {

//清除原来的返回值,把100放到返回值的位置上,如果顺利结束就返回,否则清除

return 100;

}

}

例子2,返回100

public static int method2() {

int k = 1;

while (true) {

try {

return k;

} catch (Exception e) {

e.printStackTrace();

} finally {

//遇到break,返回值位置的值被清除

break;

}

}

k=100;

return k;

}

例子3,说明finally不是一定会执行

public static int method1() {

int k = 1;

//此处抛异常或者try和catch里调用system.exit()方法finally就不会执行。

Integer.parseInt(null);

try {

return k;

} catch (Exception e) {

e.printStackTrace();

} finally {

return k;

}

}

总结

其实日常开发我们遇到最多的就是NPE问题,NPE问题即是小问题又是破坏健壮性的大问题,我们应该更好的防范一下。我刷leetcode和进行一些日常开发总结了一些经验,供大家参考下:

1、入参是对象的时候应该对入参进行判空操作

2、调用的其他人写的方法返回的是对象的时候应该对该对象进行判空操作

3、调用数据库或者远程调用的返回值应该进行判空操作

4、保证调用者为已知对象。str1.equals(str2)方法,str1应该是已知对象,str2可以为空;String.valueOf()和Integer/Long/Double.toString()返回值相同使用前者

5、自己写的方法尽量不要返回空值



推荐阅读
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 测绘程序设计Excel度分秒转换模板附代码超实用版
    本文介绍了测绘程序设计Excel度分秒转换模板附代码超实用版的相关知识,包括准备工作、编写表达式和注意事项。在实际工作中,将GPS实测的经纬度度转换为度分秒是常见需求,本文提供了在Excel中快速进行转换的方法,以提高工作效率。 ... [详细]
author-avatar
匿名用户
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有