如图所示,在JAVA中所有的异常都是继承了Throwable类
Error: 错误 .class 文件在JVM上解释运行, 如果咱们写的代码把JVM 搞塌了, 会产生Error, 只有改代码才能解决
StackOverflowError 栈溢出
堆溢出Error
Exception:
RuntimeException: 在运行时才会出现的异常, 在遇到异常之前, 都能正常运行, javac 在编译的时候, 不会出问题
非RuntimeException:
IOException, FileNotFoundException : 编译期异常
在Java中 万事万物皆是对象
异常也是一个引用数据类型 -> 类和对象
异常类: jdk中预设
异常对象: 代码出现错误的时候产生的
产生异常对象之后: 对其进行处理
一、 捕获: try-catch-finally
1. finally 可以不写, 写了之后一定会执行. 不管是有没有发生异常,都会执行,也不管前面是什么代码, 包括return 语句。
2. catch 可以抓住多个异常, 并列关系.
一般有两种处理方式:
(1) e.printStackTrace();
(2)System.out.println(e.getMessage());
如果多个异常之间没有关系, 并列, 则顺序无所谓,
catch (NullPointerException | ArrayIndexOutOfBoundsException e )
表示这一层多个异常都是这一种处理方式
注意!:如果多个异常有父子关系, 父类要子类的下面.
3. try {} 里边的变量的作用域只能是try里边, catch和finally都访问不到
4. try-catch-finally每一个结构中的代码块都可以嵌套 try-catch-finally
二、 声明:
throws 声明抛出,将自己不想处理的异常告诉调用者, 让调用者来处理
throw 人为的告诉JVM这有一错误
hrow 后面跟一个对象, 就表明这会出一个问题(抛出一个异常对象)
throw抛出的异常对象可以当场处理(但没必要)
throw如果抛出的是一个RuntimeException就可以不进行任何操作
throw 如果抛出的是一个非RuntimeException, 则必须要么处理, 要么就是抛出(在方法上进行声明)
三. 捕获和声明用处:
1. 如果本方法是一个最终的方法(main) 就进行处理
2. 如果调用方法(调用本方法的方法) 已经有一个声明了
3. 如果当前方法想要处理, 自己就办了.
四、 异常声明在方法重写中的应用
重写的方法的声明异常类 不大于 被重写的方法
五、 自定义异常
比如: 在登录的时候, 有一个用户名不存在的异常
throw new UsernameNotFoundException();
1. 明确自己要自定义的异常是什么样的异常,
(1)Runtime的异常 extends RuntimeException
(2) 非Runtime的异常 extends Exception
2. 写构造方法, 空参的, 有参的(message)
3. 使用时, 与系统预设的使用方式相同
public class UsernameNotFoundException extends Exception{
static final long serialVersionUID = -338751691234229948L;
private static final String ERROR_MESSAGE = "用户名未找到";
public UsernameNotFoundException() {
this(ERROR_MESSAGE);
}
public UsernameNotFoundException(String message) {
super(message);
}
public UsernameNotFoundException(String message, Throwable cause) {
super(message, cause);
}
public UsernameNotFoundException(Throwable cause) {
super(cause);
}
public UsernameNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
小白学习笔记 欢迎指导和补充 谢谢!