异常机制:比如小明,是一名骑行爱好者,有一天,他骑着自己心爱的捷安特自行车,骑着骑着,车胎没气了,这个问题对于他来说,是个小问题,可以解决,也可以不解决,那如果说,骑着骑着轮胎飞了,那么这个问题,是个大问题,他解决不了。那么他在出门之前,发现这个车闸松了,那么这个问题,必须解决。 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 把一段代码进行异常的捕获处理