编程异常处理指南:常见问题与解决策略
"异常在软件开发中是不可避免的,本文主要综合了编程中常见的异常类型以及对应的解决策略。包括PropertyNotFoundException、ArrayIndexOutOfBoundsException、ArrayStoreException、ClassCastException、ClassNotFoundException、CloneNotSupportedException、EnumConstantNotPresentException、Exception、IllegalAccessException以及IllegalMonitorStateException等。" 在软件开发中,异常处理是一项关键技能,它能确保程序在遇到错误时能够优雅地恢复或提供有用的错误信息。下面将对标题和描述中提及的一些异常进行详细解释: 1. **PropertyNotFoundException**: 这个异常通常发生在Java Bean中尝试访问一个不存在的属性时。例如,在使用Hibernate框架时,如果尝试调用`getGAccountId()`,但实际的getter方法应该是`getgAccountId()`,此时就会抛出这个异常。解决这个问题的方法是检查包名是否正确,以及实体类(如`gmt.boss.interfaces.customer.po.TAccount`)中的getter和setter方法是否匹配,确保所有属性的大小写和命名规范一致。 2. **ArrayIndexOutOfBoundsException**: 当试图访问数组的一个不存在的索引时,会抛出这个异常。例如,如果你试图访问一个长度为5的数组的第6个元素,系统会抛出此异常。确保在访问数组元素时,索引值始终在0到数组长度减1之间。 3. **ArrayStoreException**: 这个异常发生在尝试将一个不兼容类型的对象存储到一个数组中。例如,你不能将一个`String`对象存储到一个`Integer`数组中。在存入元素之前,确保类型匹配。 4. **ClassCastException**: 当强制类型转换失败时,比如试图将一个`Object`强制转换为不兼容的类型,就会抛出这个异常。在进行类型转换前,应先使用`instanceof`关键字检查对象的类型。 5. **ClassNotFoundException**: 当试图加载一个不存在或者找不到的类时,会抛出这个异常。检查类路径设置是否正确,确保类的`.class`文件位于指定的类路径下。 6. **CloneNotSupportedException**: 如果一个对象没有实现`Cloneable`接口,而尝试调用`clone()`方法,系统会抛出这个异常。为确保可以克隆,类需要实现`Cloneable`接口并重写`clone()`方法。 7. **EnumConstantNotPresentException**: 当尝试访问枚举类型的一个不存在的常量时,会抛出这个异常。确保枚举常量的名称与定义完全匹配。 8. **Exception**: `Exception`是所有异常的基类,当遇到无法预见的错误时,可能会抛出这个异常。通常,应该捕获特定的异常类型,而不是直接捕获`Exception`,以提供更精确的错误处理。 9. **IllegalAccessException**: 当试图访问或修改一个受保护的成员(如私有字段或方法),而没有合适的访问权限时,会出现这个异常。确保代码在访问非公共成员时遵循正确的访问控制规则。 10. **IllegalMonitorStateException**: 当线程在没有持有监视器锁的情况下调用`wait()`, `notify()`或`notifyAll()`时,会抛出这个异常。在使用synchronized块或方法确保线程对共享资源的访问顺序。 理解这些异常并知道如何处理它们对于编写健壮和可靠的代码至关重要。在遇到这些异常时,应仔细审查代码,确保所有的逻辑和数据访问都是正确的,并适当地使用异常处理机制,如try-catch-finally结构,来捕获和处理异常。
PropertyNotFoundException异常
想了很久发现 get 方法最可能出错,于是把getGAccountId() 改成getgAccountId();显然这是不符合javabean的命名规范的,但是问题竟然解决了。反编译了hibbernate代码发现hibbernate是这么处理的,首先利用配制文件的package 和 name 找到要映射到的类,按上面的配制文件就是 gmt.boss.interfaces.customer.po.TAccount,然后利用反射取出这个类的信息,取的时候利用了缓存的机制,不是每次都反射一次。然后用这个类的信息中的get,set方法 和 配制文件中进行匹配。以上面的getGAccountId()为例, 先去掉这个方法中的前三位取余下的部分为flag1 = GAccountId,然后调用jdk中的Introspector.decapitalize把这个字符串dropCase 得到flag2, 然而 Introspector.decapitalize dropCase的过程,如果这个字符串开头为一个以上的大写字母,那就不做任何操作反回原串,,所以flag2 =GAccountId 。
匹配的过程为只要 flag1 与flag2 中有一个和 配制文件中的property name一致就为正确的映射。GAccountId 显然和 <property name="gAccountId" column="G_ACCOUNT_ID" type="java.lang.String" />无法匹配,抛出
PropertyNotFoundException 也就很自然了。
***************************************************************
java中常见异常
java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
java.lang.ArrayStoreException
数组存储异常。当向数组中存放非数组声明类型对象时抛出。
java.lang.ClassCastException
类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
java.lang.ClassNotFoundException
找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
java.lang.CloneNotSupportedException
不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
java.lang.EnumConstantNotPresentException
枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。
java.lang.Exception
下载后可阅读完整内容,剩余3页未读,立即下载
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Unity UGUI性能优化实战:UGUI_BatchDemo示例
- Java实现小游戏飞翔的小鸟教程分享
- Ant Design 4.16.8:企业级React组件库的最新更新
- Windows下MongoDB的安装教程与步骤
- 婚庆公司响应式网站模板源码下载
- 高端旅行推荐:官网模板及移动响应式网页设计
- Java基础教程:类与接口的实现与应用
- 高级版照片排版软件功能介绍与操作指南
- 精品黑色插画设计师作品展示网页模板
- 蓝色互联网科技企业Bootstrap网站模板下载
- MQTTFX 1.7.1版:Windows平台最强Mqtt客户端体验
- 黑色摄影主题响应式网站模板设计案例
- 扁平化风格商业旅游网站模板设计
- 绿色留学H5模板:科研教育机构官网解决方案
- Linux环境下EMQX安装全流程指导
- 可爱卡通儿童APP官网模板_复古绿色动画设计