一、递归
方法直接或者间接调用本身
将大问题, 层层转化为一个与原问题相似的、规模更小的问题来解决
二、异常
程序在编译或执行过程中,出现的非正常的情况 (错误)
语法错误不是异常
1、阅读异常信息
从下往上看:发生异常的位置、异常名称、发生异常的原因
Java 中的所有异常都是类
2、异常的体系结构
(1)Error
严重级别问题
常见的 : 栈内存溢出 (StackOverflowError) 堆内存溢出 (OutOfMemoryError)
(2)Exception:
RuntimeException 及其子类:运行时异常
编译阶段没有错误,运行时可能会出现的错误,通常是程序员代码不严谨造成的
除RuntimeException 之外所有的异常:编译时异常
编译阶段就出现的错误,主要起到提醒作用
三、异常的处理方式
1、Java 对于异常的默认处理方式:向上抛出
虚拟机会在出现异常的代码那里自动的创建一个异常对象:例如 ArithmeticException
异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
虚拟机接收到异常对象后,先在控制台直接输出异常信息数据
随后终止 Java 程序的运行
后续代码没有机会执行了,因为程序已经被终止了
2、异常处理方式:try...catch...
异常可以被捕获,执行处理方案,后续的代码也可以继续执行
System.out.println("start");
try {
int[] a = {1, 2};
int[] b = null;
System.out.println(b[0]); // new NullPointerException()
System.out.println(a[2]);
System.out.println(10 / 0);
} catch (ArithmeticException e) {
System.out.println("ArithmeticException");
} catch (NullPointerException e) { // NullPointerException e = 上面的异常对象
System.out.println("NullPointerException");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException");
} catch (Exception e) {
System.out.println("Exception");
}
System.out.println("end");
输出:
start
NullPointerException
end
Tips:如果使用多个catch, 最大的异常需要放在最后
3、throws 抛出异常
(1)throws:用在方法上,作用是声明,声明这个方法中有可能会出现异常
格式:public void method() throws 异常1,异常2,异常3... { }
(2)throw : 用在方法中, 后面跟的是异常对象, 其作用是抛出异常对象
抛出的异常对象如果是编译时异常, 必须使用 throws 声明
如果是运行时异常, 则不需要写 throws
public void setAge(int age) throws Exception {
if (age >= 0 && age <= 120) {
this.age = age;
} else {
throw new Exception("年龄错误,应在0-120岁之间"); // 抛出编译时异常
}
}
4、两种方式的选择
看这个异常是否需要暴露出来
需要:抛出
不需要:try…catch
四、自定义异常
Java无法为这个世界上全部的问题提供异常类
如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常
1、自定义编译时异常
定义一个异常类继承Exception,重写构造器
2、自定义运行时异常
定义一个异常类继承RuntimeException,重写构造器
public class AgeException extends RuntimeException {
public AgeException() {
}
public AgeException(String message) {
super(message);
}
}
// --------
public void setAge(int age) {
if (age >= 0 && age <= 120) {
this.age = age;
} else {
throw new AgeException("年龄错误,应在0-120岁之间");
}
}
五、异常的细节
1、Throwable的常用方法
2、子类重写父类方法时,不能抛出父类没有的异常,或者比父类更大的异常