异常机制:比如小明,是一名骑行爱好者,有一天,他骑着自己心爱的捷安特自行车,骑着骑着,车胎没气了,这个问题对于他来说,是个小问题,可以解决,也可以不解决,那如果说,骑着骑着轮胎飞了,那么这个问题,是个大问题,他解决不了。那么他在出门之前,发现这个车闸松了,那么这个问题,必须解决。
Throwable
Error 错误,属于严重性问题,我们无法解决
Exception 异常 属于一般性问题,我们是可以解决的。
分两种:
运行期异常:可以解决,也可以不解决 RuntimeException及其子类
编译期异常:必须处理,发生在编译期间。非RuntimeException及其子类
RuntimeException的子类:
ArithmeticException 数学异常 运行期异常,你自己没有处理,那就交给了JVM去处理,那么JVM的处理方式,是打印异常信息,然后退出虚拟机。
int a=10;
int b=0;
System.out.println(a/b);
如果我们觉得JVM默认处理运行期异常的方式,不是很友好好,那么我们自己可以处理一下我们需要使用 try catch 关键字 对异常进行捕获处理
finally //最终的不管你有没有遇到异常,那么finally里面的代码都会执行
int a = 10;
int b = 0;
try {
System.out.println(a / b);
}catch (ArithmeticException e){
//一旦发生异常,你对异常的具体处理逻辑
System.out.println("0为除数了");
}finally {//最终的不管你有没有遇到异常,那么finally里面的代码都会执行
System.out.println("释放资源");
if(scanner!=null){
scanner.close(); //释放资源
}
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组角标越界异常
Exception 其他未知异常
注:你能明确异常的类型,你就尽量的明确,不要拿最大的异常去捕获。
多个异常类,如果是并列关系,前后无所谓
多个异常类,如果有父子,关系,父类写在最后面
如何处理编译器异常
方式1,抛出异常 throws ,抛给调用者去处理,俗称甩锅 谁调用谁处理
方式2:自己try catch 处理
throws与throw的区别
throws:用在方法声明上,可以抛出多种异常类型 他只是抛出了一种可能性,有可能这种异常会发生,并不代表一定会发生
throw:用在方法内部,只能抛出一种异常对象,这种只要抛出了, 那这种异常肯定是发生了
当JVM都不知道什么异常的时候 就要自己定义一个异常 但要继承RuntimeException
public class MyTest {
public static void main(String[] args) {
//当Java给我们提供的这些异常类型,不满足我们的需要时,我们需要自定义异常
int num=100;
System.out.println("请输入取款金额");
Scanner scanner = new Scanner(System.in);
int money = scanner.nextInt();
if(money<=num){
num-=money;
System.out.println("取款成功");
}else{
//System.out.println("");
throw new NoMoneyException("余额不足");
}
}
}
public class NoMoneyException extends RuntimeException {
public NoMoneyException(String msg) {
super(msg);
} //将我写的这个异常类,纳入Java到Java的异常体系当中
}
快捷键ctrl+alt+T 把一段代码进行异常的捕获处理