异常处理
什么是异常
身体上的异常: 生病
代码中的异常:
ArrayIndexOutOfBoundsException 数组下标越界异常
NullPointerException 空指针异常
ClassNotFoundException 类不存在异常
SQLException 数据库语句异常
BUG:
程序运行过程中一些不可预知的情况!!!
错误和异常都是有前因后果的
Throwable类
Throwable 是 java 中所有错误(Error)和异常(Exception)的超类。
错误和异常的区别:
Error: 错误,只能避免不能处理。
Exception: 异常,可以处理。
Constructor(构造方法)
Throwable(); 创建一个 Throwable 类对象,并且在 Throwable 类内的异常信息为null
Throwable(String message); 创建一个 Throwable 类对象,使用message 字符串作为异常信息。
Method(方法):
String getMessage();获取异常信息;
String toString();返回当前异常的简要描述字符串;
void printStackTrace();展示异常或者错误的前因后果。
捕获异常
两种结构
try - catch
try - catch - finally
格式
try {
有可能出现异常的代码
} catch (异常对象) {
针对当前异常对象的处理方式
} catch (异常对象) {
针对当前异常的处理方式
}
try - catch 使用注意事项:
1、try 语句块中是有可能出现异常的代码
2、catch 之后小括号里面的内容,是需要捕获的异常对象。大括号里面的内容是处理方式。
3、java代码中的异常如果被 try - catch 捕获处理,JVM就会认为代码没有异常,继续运行。
4、可以使用多个 catch 块来捕获不同的异常,异常按照各自的情况分门别类处理。
5、catch Exception 是可以处理任何异常,但是这样的方式会导致代码中的异常处理单一化,无法做到分门别类处理!
抛出异常
使用到的关键字:
throw: 用于在方法中抛出异常
throws: 用于在方法声明位置告知调用者,当前方法抛出的异常类型有哪些。
throw 和 throws 使用注意事项:
1、throw 抛出异常,从抛出异常位置开始,代码终止运行。
2、在同一个代码块内,不能抛出两个异常,如果有多个异常抛出,需要在不同的代码块中抛出
3、如果代码中抛出了异常,要求在方法的声明位置使用 throws 告知调用者,这里有异常抛出需要处理。如果存在多个异常抛出,不同的异常使用 ,(逗号) 隔开。
4、调用一个带有抛出异常的方法,需要处理当前方法的异常有两种,继续抛出或者捕获。
原则:
底层代码只要不涉及到用户界面,可以任意抛
但是一旦涉及到用户界面,必须捕获!!
自定义异常
Java提供了大量的异常,但是还是无法满足实际的生活情况!!!
生活逻辑上的一些异常,无法使用Java中本来的异常完美的解释!!!
自定义异常格式
class 自定义异常格式 extends Exception {
构造方法
无参数构造方法和带有一个String message 异常信息构造方法
}
自定义异常示例:
class StaticPersonException extends Exception {
/**
* 静态人士异常
*/
public StaticPersonException() {}
public StaticPersonException(String message) {
super(message);
}
/*
后期成员方法可以完成对于异常其它处理
例如:
记录日志文件,通过网络发送异常,转换其他方式...
*/
}
public class Demo6 {
public static void main(String[] args) throws StaticPersonException {
buyOneFreeOne(false);
}
/**
* 买一送一
* @param isSingleDog boolean 是不是静态人士
* @throws StaticPersonException 静态人士异常
*/
public static void buyOneFreeOne(boolean isSingleDog) throws StaticPersonException {
if (isSingleDog) {
throw new StaticPersonException("路见不平一声吼");
}
System.out.println("xxxxx");
}
}