1:概述
异常体系
1:Exception 和 Error 有什么区别?
Exception 和 Error 都是 Throwable 的子类。Exception 用于用户程序可以捕获的异常情况。Error 定义了不期望被用户程序捕获的异常。
分类
-
异常事件可分为两类:
Error:Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。比如:StackOverflowError 和 OOM。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
- 编译时期异常:checked 异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
运行时期异常:runtime 异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
2:常见异常
NullPointerException 空指针异常
- ClassNotFoundException 指定类不存在
- NumberFormatException 字符串转换为数字异常
- IndexOutOfBoundsException 数组下标越界异常
- ClassCastException 数据类型转换异常
- FileNotFoundException 文件未找到异常
- NoSuchMethodException 方法不存在异常
- IOException IO 异常
- SocketException Socket 异常 -
3:处理异常
1)抛出异常 throw
2)声明异常 throws
throw 和 throws 有什么区别?
Throw 用于方法内部,Throws 用于方法声明上
Throw 后跟异常对象,Throws 后跟异常类型
Throw 后只能跟一个异常对象,Throws 后可以一次声明多种异常类型
3)捕获异常 try…catch
1:在项目中不要捕获 Java 类库中继承自 RuntimeException 的运行时异常,ndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查违法来规避,保证程序健壮性。
2:对大段代码进行 try-catch,这是不负责任的表现。 catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
3:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
4:有特殊的流关闭等操作一定必须放在 finally 中
程序检测
If(num==0){}
方式一:try-catch-finally
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
getMessage() 获取异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值 void。
方式二:throws + 异常类型
方法三:手动抛出异常
首先要生成异常类对象,然后通过 throw 语句实现抛出操作(提交给 Java 运行环境)。
IOException e=new IOException();
Throw e;
可以抛出的异常必须是 Throwable 或其子类的实例。下面的语句在编译时将会产生语法错误:
Throw new String(“wanttothrow”);
4:用户自定义异常类
定义异常类
// 业务逻辑异常
public class RegisterException extends Exception {
/**
* 空参构造
*/
public RegisterException() {
}
/**
*
* @param message 表示异常提示
*/
public RegisterException(String message) {
super(message);
}
}
使用
public static boolean checkUsername(String uname) throws LoginException{
for (String name : names) {
if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
throw new RegisterException("亲"+name+"已经被注册了!");
}
}
return true;
}
}
总结:
1:在项目中不要捕获 Java 类库中继承自 RuntimeException 的运行时异常,这类异常由程序员预检查违法来规避,保证程序健壮性。
2:不能大段进行 try……catch……对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。给出准确的异常处理信息
3:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
4:有特殊的流关闭等操作一定必须放在 finally 中
5:请确保在 Javadoc 中添加一个@throws 声明,并描述可能导致的异常情况。