Java异常
2023-12-26 18:57:30 124 举报
AI智能生成
Java异常是Java程序在运行过程中发生的错误或问题。当程序遇到无法处理的问题时,会生成一个异常对象,并抛出该异常。Java异常分为两大类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。受检异常需要在代码中显式地进行捕获或声明抛出,而非受检异常则不需要。Java提供了一套完整的异常处理机制,包括try-catch语句、finally语句和throws关键字等,以便在程序发生异常时能够及时捕获并进行相应的处理。合理地使用异常处理机制可以提高程序的健壮性和可靠性。
作者其他创作
大纲/内容
推荐使用方式
通过检查的方式规避RunTimeException,而不是catch的方式
异常不要用来做流程控制,条件控制。
捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之
有try块放到了事务代码中,catch异常后,如果需要回滚事务,一定要注意手动回滚事务。
finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch
不要在finally块中使用return。
捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类
在调用RPC、二方包、或动态生成类的相关方法时,捕捉异常必须使用Throwable类来进行拦截。
方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。
定义时区分unchecked / checked 异常
对于公司外的http/api开放接口必须使用“错误码”;而应用内部推荐异常抛出;跨应用间RPC调用优先考虑使用Result方式,封装isSuccess()方
法、“错误码”、“错误简短信息”
法、“错误码”、“错误简短信息”
要点
即使 catch 中包含了 return 语句,finally 子句依然会执行。
若 finally 中也包含 return 语句,finally 中的 return 会覆盖前面的 return.
若 finally 中也包含 return 语句,finally 中的 return 会覆盖前面的 return.
try-with-resource
try 代码块退出时,会自动调用 scanner.close 方法,和把 scanner.close 方法放在 finally 代码块中不同的是,
若 scanner.close 抛出异常,则会被抑制,抛出的仍然为原始异常。
被抑制的异常会由 addSusppressed 方法添加到原来的异常,如果想要获取被抑制的异常列表,可以调用 getSuppressed 方法来获取。
若 scanner.close 抛出异常,则会被抑制,抛出的仍然为原始异常。
被抑制的异常会由 addSusppressed 方法添加到原来的异常,如果想要获取被抑制的异常列表,可以调用 getSuppressed 方法来获取。
抛出的异常越明确越好
永远记住,你的同事或者几个月之后的你,将会调用你的方法并且处理异常。
对异常进行文档说明
使用描述性消息抛出异常
优先捕获最具体的异常
不要捕获 Throwable 类
不要记录并抛出异常
不要重复处理异常
包装异常时不要抛弃原始的异常
异常处理
声明异常
throws
抛出异常
throw
捕获异常
try
catch
finally
结构
Throwable
Error
(错误)
(错误)
VitulMachineError
StackOverFlowError(堆栈溢出)
当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误
OutOfMemoryError(内存不足)
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误
AWTError
LinkageError
NoClassDefFoundError
IncompatibleClassChangeError
IllegalAccessError(违法访问错误)
当试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
InstantiationError(实例化错误)
当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.
Exception
(异常)
(异常)
受检查异常
(非RuntimeException均是受检异常)
(非RuntimeException均是受检异常)
IOException
EOFException
FileNotFoundException
ReflectiveOperationException
ClassNotFoundException(找不到类)
1.根绝指定路径没有找到指定类;2.该类已被加载。
试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
InstantiationException(实例化异常)
当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常
NoSuchFieldException(属性不存在异常)
当访问某个类的不存在的属性时抛出该异常
NoSuchMethodException(方法不存在异常)
当访问某个类的不存在的方法时抛出该异常
RuntimeException
(不受检异常)
(不受检异常)
NullPointException(空指针)
ArithmeticException(算术条件异常)
IndexOutOfBoundsException(索引越界)
StringIndexOutOfBoundsException(字符串越界)
ArrayIndexOutOfBoundsException(数组越界)
ClassCastException(类转换异常)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
IO操作的BufferOverflowException异常
IllegalArgumentException
NumberFormatException(数字格式异常)
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常
0 条评论
下一页