Java基础 Day17

一、递归

方法直接或者间接调用本身

将大问题, 层层转化为一个与原问题相似的、规模更小的问题来解决

二、异常

程序在编译或执行过程中,出现的非正常的情况 (错误)

语法错误不是异常

1、阅读异常信息

从下往上看:发生异常的位置、异常名称、发生异常的原因

Java 中的所有异常都是类

2、异常的体系结构

(1)Error

严重级别问题

常见的 : 栈内存溢出 (StackOverflowError) 堆内存溢出 (OutOfMemoryError)

(2)Exception:

RuntimeException 及其子类:运行时异常

编译阶段没有错误,运行时可能会出现的错误,通常是程序员代码不严谨造成的

除RuntimeException 之外所有的异常:编译时异常

编译阶段就出现的错误,主要起到提醒作用

三、异常的处理方式

1、Java 对于异常的默认处理方式:向上抛出

虚拟机会在出现异常的代码那里自动的创建一个异常对象:例如 ArithmeticException

异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机

虚拟机接收到异常对象后,先在控制台直接输出异常信息数据

随后终止 Java 程序的运行

后续代码没有机会执行了,因为程序已经被终止了

2、异常处理方式:try...catch...

异常可以被捕获,执行处理方案,后续的代码也可以继续执行

java 复制代码
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

java 复制代码
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,重写构造器

java 复制代码
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的常用方法

|-------------------------------|-------------|
| public String getMessage() | 获取异常的错误原因 |
| public void printStackTrace() | 展示完整的异常错误信息 |

2、子类重写父类方法时,不能抛出父类没有的异常,或者比父类更大的异常

相关推荐
vipxieliang几秒前
ValidX 财务系统发票验证:发票号、税号、金额校验
java·spring boot
天空鸟_时光不老2 分钟前
06-给AI流程加一道人工闸门
java·人工智能·spring boot·后端·spring·spring cloud·架构
平生幻3 分钟前
unbuntu虚拟机确认python安装位置
开发语言·python
夜之眷属4 分钟前
JVM实战:服务器堆外内存去哪了(NMT实测)
java·服务器·jvm·后端·性能优化
fundoit12 分钟前
OIDC的UserInfo端点
java·架构·oauth2·oidc
运维行者_15 分钟前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则
Wang's Blog18 分钟前
Java框架 SpringCloud 快速入门: Nacos 配置管理之添加配置与 dataId 命名规范
java·开发语言·spring cloud
JAVA面经实录91721 分钟前
Java高级后端 · 全套面试通关手册(Nginx)
java·nginx·面试
阿俊-全栈开发26 分钟前
LikeShop单商户Java商城如何从容承接高并发流量?
java·开发语言·spring boot·spring·系统架构
云樱梦海28 分钟前
5 分钟上手 IndexTTS 2.5 便携包:不用装 Python、不挑显卡、本地离线跑语音克隆
开发语言·python·tts·indextts2.5