为了程序的正常运行,为了定位代码问题所在,对用户的友好提示
1.异常体系
SQlException——》编译时异常
- Throwable类是Java语言中所有错误和异常的超类。 只有作为此类(或其子类之一)的实例的对象throw Java虚拟机抛出,或者可以由Java throw语句抛出。
- 类Throwable及其子类有两个构造函数,一个不带参数,另一个String可用于生成详细消息的String参数。
- 此外,那些可能与它们相关的原因的子类应该有两个构造函数,一个采用Throwable (原因),另一个采用String (详细消息)和Throwable (原因)。
构造方法
权限 | 构造器 | 描述 |
---|---|---|
public | Throwable() | 使用 null构造一个新的throwable作为其详细消息。 |
public | Throwable(String message) | 使用指定的详细消息构造一个新的throwable。 |
public | Throwable(Throwable cause) | 构造具有指定的原因和详细消息的新throwable 。 |
public | Throwable(String message, Throwable cause) | 使用指定的详细消息和原因构造一个新的throwable。 |
protected | Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) | 构造具有指定详细消息的新throwable,原因是,启用或禁用了 suppression ,并启用或禁用了可写堆栈跟踪。 |
2.异常处理
- 1.异常捕获处理:try-catch或者try-catch-finally
String s = "a";
int i = 0;
try {
i= Integer.parseInt(s);
System.out.println(i);
} catch (NumberFormatException e) {
System.out.println("类型转化出错");
//异常对象本身的信息
System.out.println(e.getMessage());
e.printStackTrace();
} catch (ClassCastException e1) {
System.out.println("类型不匹配出错");
} finally {
System.out.println("重新输入");
}
System.out.println(i);
结果
类型转化出错
For input string: "a"
重新输入
0
java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at StringStudy.main(StringStudy.java:14)——》异常位置
- 2.异常抛出:throws+异常类型。
static void test2() {
//手动抛出异常对象
throw new NumberFormatException();
}
//抛出异常声明,交给其他的处理
public static void main(String[] args) throws NumberFormatException, IOException {
//处理异常
try {
test2();
} catch (NumberFormatException e) {
System.out.println("类型转化出错");
//异常对象本身的信息
System.out.println(e.getMessage());
e.printStackTrace();
}
}
结果
类型转化出错
null
java.lang.NumberFormatException
at StringStudy.test2(StringStudy.java:42)
at StringStudy.main(StringStudy.java:31)
3.处理原则
运行时异常一定要改代码,增加参数校验,判断等。
编译时异常进行异常处理。
- 1.多个异常,且存在子父类关系时,子类在上(优先匹配)
- 2.三大原则:具体明确,提早抛出,延迟捕获.
具体明确: 通过使用多个catch块来给用户提供捕获到异常的明确信息。
提早抛出: 检测到错误时立刻抛出异常来实现迅速失败。
延迟捕获: 解决不了,那么就不要处理异常,把它留到后面捕获和在恰当的层面处理。
4.自定义异常
/**
* 多数情况下,创建自定义异常需要继承Exception,本例继承Exception的子类RuntimeException
*/
public class CustomerException extends RuntimeException {
private String retCd ; //异常对应的返回码
private String msgDes; //异常对应的描述信息
public CustomerException() {
super();
}
public CustomerException(String message) {
super(message);
msgDes = message;
}
public CustomerException(String retCd, String msgDes) {
super();
this.retCd = retCd;
this.msgDes = msgDes;
}
public String getRetCd() {
return retCd;
}
public String getMsgDes() {
return msgDes;
}
}