Java中常用的异常处理情况及关于开发中异常处理的建议

本周四老师由一个简单程序将问题引出,讲授了Java中异常处理的情况。根据课件内容及上网查阅资料,将关于JAVA项目中的常用的异常处理情况总结如下:

首先什么是异常(Exception):发生于程序执行期间,表明出现了一个非法的运行状况。许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象。异常处理的目的是依据实际情况提供不同的错误应对策略与手段,使程序更稳定,更安全。异常处理的主要用途是提供准确的错误消息,解释失败的原因、位置和错误类型等,同时提供一定的恢复能力,尽可能地保证数据完整性不被破坏,并让程序能继续运行。

Java中有许多内置异常类:定义了一些异常类在 java.lang 标准包中。标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。Java 根据各个类库也定义了一些其他的异常,下面的列出了 Java 的非检查性异常。

ArithmeticExceptio当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。

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

ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。

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

IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。

IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。

IllegalStateException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。

IllegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。

IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。

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

NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

SecurityException由安全管理器抛出的异常,指示存在安全侵犯。

StringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。

UnsupportedOperationException当不支持请求的操作时,抛出该异常。

下面的表中列出了 Java 定义在 java.lang包中的检查性异常类。

ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。

CloneNotSupportedException当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。

IllegalAccessException拒绝访问一个类的时候,抛出该异常。

InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。

InterruptedException一个线程被另一个线程中断,抛出该异常。

NoSuchFieldException请求的变量不存在

NoSuchMethodException请求的方法不存在

java.lang.OutOfMemoryError这个错误每个人都会遇到,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。

导致OutOfMemoryError异常的常见原因有以下几种:

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

代码中存在死循环或循环产生过多重复的对象实体;

使用的第三方软件中的BUG;

启动参数内存值设定的过小;

此错误常见的错误提示:

tomcat:java.lang.OutOfMemoryError: PermGen space

tomcat:java.lang.OutOfMemoryError: Java heap space

weblogic:Root cause of ServletException java.lang.OutOfMemoryError

resin:java.lang.OutOfMemoryError

java:java.lang.OutOfMemoryError

解决java.lang.OutOfMemoryError的方法有如下几种:

增加jvm的内存大小。方法有: 1)在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。 2)对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:3)对resin容器,同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件。其次优化程序,释放垃圾。主要包括避免死循环,应该及时释放种资源:内存, 数据库的各种连接,防止一次载入太多的数据。导致java.lang.OutOfMemoryError的根本原因是程序不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。

所以在遇到异常处理情况时应从以下建议考虑:

1:在中间层组件中抛出异常,在界面层组件中捕获异常在底层组件中捕获JVM抛出的“只有程序员能看懂的”异常,转换为中间层的业务逻辑异常,再由界面层捕获以提供有意义的信息。

2:自身能够处理的异常,不要再向外界抛出。

3:尽可能地在靠近异常发生的地方捕获并处理异常。

4:尽可能地捕获最具体的异常类型,不要在中间层用 catch(Exception)“吃掉”所有异常

5:在开发阶段捕获并显示所有异常信息,发布阶段要移除部分代码,以避免“过于专业”的异常信息困扰用户,特别地,系统发布之后,不要将服务端异常的详细信息发给客户端,以免被黑客利用

原文地址:https://www.cnblogs.com/fuheishi/p/9941471.html

时间: 2024-10-11 18:12:09

Java中常用的异常处理情况及关于开发中异常处理的建议的相关文章

Java中的transient关键字,在移动开发中的使用

transient关键词修饰的属性是临时的,不会被序列化.那么开发移动接口的同志们应该特别注意使用,这样可以提高不少效率.当然其他方面也要适当使用,通过这个特性,可以提高序列化的效率! 百度解释如下,看似别扭难理解,明天去公司写段代码上海,让大家参考下! Java中的transient关键字,在移动开发中的使用,码迷,mamicode.com

MySQL中各种数据类型的长度及在开发中如何选择

接触MySQL这个数据库大概快要两年了,不过由于没有特别深入系统的去学习,大多也是停留在一知半解的状态.今天在工作中刚好碰到了表设计的问题,顺便写篇博客,把MySQL中数据类型和字段类型选择这方面给弄清楚. MySQL中的数据类型大体分为三大类,数值类型,时间日期类型以及字符串类型.下面将对这三种类型进行详细的介绍. 一.数值类型 MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL 和NUMERIC),以及近似数值数据类型(FLO

Java功底篇系列-02-如何理解实际开发中与“排序”相关的问题

场景一:找出100W数据中TOP10 很自然的想法是排序,可是要知道对100W数据进行排序,不论采用什么样的排序算法吧,最坏情况下,应该是100W*100W的计算量,太大了. 可是,不排序又能怎么做呢?为什么要排序呢?我们仅仅需要的是TOP10. 思考下,找出100W数据中TOP1,你会排序吗? 找TOP1,相信大家和我一样,都不会去排序,应该是搞一个变量max认为它最大,然后遍历一边100W数据,在遍历过程中进行比较替换max就可以了找到TOP1. 依此规律,我们为什么不搞一组变量max1,m

工作中常用的Linux命令(不断更新中)

最近工作中用到linux命令,简单总结如下: 1. pwd 查看当前所在的文件路径 2. cd 切换目录 cd .. 切换到上一级目录 3. ls 列出当前文件路径下的所有文件和文件夹 4. ll 是ls -l的一个别名,列出文件的详细属性 5. mkdir 创建新文件夹 6. cp 复制文件 7. rm 删除文件 rm -rf 删除文件夹

iOS开发中常用的轮子 第四篇 收集齐7个轮子,准备高仿部分微博APP页面

产品原因有几张页面会参考微博APP来做,先收集齐轮子:计划这周完成,然后放到github上开源. 1,微博流刷新: 2,浏览微博中的图片: 3,发布微博: 4,发微博时选择照片: ============分割线:具体如下 ============= 选择相册中图片: 1,UzysAssetsPickerController 链接:https://github.com/uzysjung/UzysAssetsPickerController 介绍:用于替换UIImagePickerControlle

iOS开发中常用的轮子 第四篇 抽屉和侧滑效果

为避免重复造轮子,很多效果和功能都可以从github上找到.清点以前的项目,整理出了很多用过的开源代码,每天奉送一批. 学习例子的方法: 1,了解:运行一遍例子,弄清这些代码的究竟是什么: 2,使用:在之后开发工程中使用这些例子: 3,研究代码:研究例子的代码的实现,简单修改做出自己的效果. 记得要么是facebook,或是twitter第一个使用了个交互效果:而后风靡全球,是产品必用抽屉:再后来就是延生出了各种变形过的效果: 所以,产品经理要你实现抽屉和侧滑效果时,一定要确定到底是什么样抽屉和

Java中常用的JSON工具

1.Java中常用的JSON工具 Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀. Jackson: 社区十分活跃且更新速度很快. 2.以下教程基于 FastJson 讲解. 在 Maven 构建的项目中,在 pom.xml 文件中加入以下依赖即可. <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</a

Java IO在实际开发中的应用

IO是java绕不过去的槛,在开发中io无处不在, 正如同 世界上本没有路,java io写多了,也就知道了大体是什么意思,在读完thinking in java 感觉就更清晰了,结合具体的业务场景,整理一下 ,什么是IO.为什么JAVA要这么设计IO. 先来一道开胃菜 我想要读取控制台输入的字符 解释一下:我从控制台读取一行字符,然后打印一下.这就是一个简单的流了. 整理一下: 就是我先 得到一个用于读取 控制台输入的流,然后 我·打印我得到的东西,这里有个细节就是 流一定得关闭,这是底线,关

javascript中常用函数汇总

js中函数很多,在实际项目开发中,函数的应用可以很大程度上简化我们的代码,所以在此记下开发中js中常用的函数,增强记忆. 1.isNaN(X):函数用于检查其参数是否是非数字值. 如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true.如果 x 是其他值,则返回 false.(是非数字值则为true,是数字则返回false) isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字.当然也可以用