异常的好处:
* 学习异常,了解异常,处理异常,从而保证程序可以正常的运行
Throwable类
* 类的特点
* Throwable 类是 Java 语言中所有错误(Error)或异常(Exception)的父类
* 错误(Error):Java程序出现了不可以通过后期自动补救方法进行解决的错误,只能改写代码
* 异常(Exception):Java程序出现可以通过后期自动补救方法进行解决的错误,不用后期改写代码,提前做好准备
* 类的位置
* java.lang
* 类的构造器
* public Throwable()
* 构造一个将 null 作为其详细消息的新 throwable。
* public Throwable(String message)
* 构造带指定详细消息的新 throwable。
* 类的方法
* public void printStackTrace()
* 将此 throwable 及其追踪输出至标准错误流
* public String getMessage()
* 返回此 throwable 的详细消息字符串。
异常的分类:
* 运行时异常
* 编译时异常
*
* 运行时异常:
* 含义:
* 代码没有任何语法格式错误,在运行代码的时候出现了非正常的情况导致JVM停止运行
* 位置:
* RuntimeException类及其子类
* 常见:
* 空指针异常
* 索引越界异常
* 类型转换异常
* 数据格式化异常
* .......
*
* 编译时异常
* 含义:
* 代码没有任何语法格式错误,在编译代码的时候出现了编译报错
* 位置:
* Exception类及其子类(RuntimeException类及其子类除外)
异常处理:
* 含义:
* Java程序中所有的异常必须进行处理
* 分类:
* 异常声明处理:将异常问题交给调用者进行解决
* 异常捕获处理:将异常问题自己独立进行解决(推荐)
* 关键字:
* throws,try,catch,finally
*
* 运行时异常的处理方案:
* 1.异常声明处理
* 2.异常捕获处理
* 3.无需程序员进行处理
* 如果程序员不针对运行时异常处理JVM主动进行处理:
* (1)终止JVM
* (2)终止的同时,将异常信息进行打印
*
* 编译时异常的处理方案:
* 1.异常声明处理
* 2.异常捕获处理
throw关键字:
* 含义:
* 抛出指定的异常对象
* 格式:
* throw new 异常类名(实参);
异常处理方式1:异常声明处理
* 含义:
* 含有异常的方法不进行异常的处理,将异常交给其调用者进行解决
* 格式:
* 修饰符 返回类型 方法名 () throws 异常类名1,异常类名2,......,异常类名n {}
异常声明处理的注意事项:继承
* 继承关系出现在抛出的异常对象中
* 1.进行异常声明时无需关注声明异常子父类的前后顺序
* 2.进行异常声明时可以直接声明异常的父类
* 继承关系出现在异常所在的类中
* 异常在父类被重写的方法中,子类重写该方法时无需理会该异常
* 异常在子类重写后的方法中,处理方案只有唯一的一种,异常的捕获处理
异常捕获处理
* 含义:
* 捕获到程序出现的异常,针对异常进行合理的解决方案,从而保证程序可以正常运行
* 格式1:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* }
* 格式2:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } ......
* 格式3:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } finally {
* 必须执行的代码
* }
* 格式4:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* }
* ......
* finally {
* 必须执行的代码
* }
* 格式5(JDK7.0):
* try (
* 类名 对象名 = new 类名();
* ......
* ) {
* 可能出现异常的代码
* } catch () {
* 出现该异常的解决方案
* }
* 格式6(JDK7.0):
* try (
* 类名 对象名 = new 类名();
* ......
* ) {
* 可能出现异常的代码
* } catch () {
* 出现该异常的解决方案
* } catch () {
* 出现该异常的解决方案
* } .....
异常捕获的注意事项:
* 继承关系出现在抛出的异常对象中
* 1.分别捕获,分别处理
* 场景:适用于每个异常都有特有的解决方案
* 2.一次捕获,分别处理
* 场景:每个异常存在关联性,解决方案各自不同
* 注意:需要将异常子类的处理放在父类的上面(前面)
* 3.一次捕获,一次处理
* 场景:每个异常存在关联性,解决方案相同
* 继承关系出现在异常所在的类中
* 异常在父类被重写的方法中,处理方案只有唯一的一种,异常的捕获处理
* finally关键字
* 含义:
* 在进行异常捕获声明时必须执行的代a码
* 格式:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } finally {
* 必须执行的代码
* }
*
*
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* }
* ......
* finally {
* 必须执行的代码
* }
* finally关键字
* 含义:
* 在进行异常捕获声明时必须执行的代a码
* 格式:
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } finally {
* 必须执行的代码
* }
*
*
* try {
* 可能出现异常的代码
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* } catch (异常类型 对象名) {
* 出现该异常的解决方案
* }
* ......
* finally {
* 必须执行的代码
* }
finally关键字的注意事项
* 在try...catch...finally里面尽量避免使用return
自定义异常:
* 自定义运行时异常
* 自定义编译时异常(重点)
*
* 自定义运行时异常:
* 1.创建自定义运行时异常类
* 2.将该类继承RuntimeException类
* 3.根据父类生成合适的构造器(至少包含无参和String参数的构造器)
*
* 自定义编译时异常:
* 1.创建自定义编译时异常类
* 2.将该类继承Exception类
* 3.根据父类生成合适的构造器(至少包含无参和String参数的构造器)
包装类整型的特殊数据:
* 在底层缓冲了一个长度为256的对应包装类型的数组,存储-128~127的该类型的对象,如果在范围内,拿数组中对象进行复用,
* 如果不在范围内,new新的该类型的对象
*
* 包装类字符型的特殊数据:
* 在底层缓冲了一个长度为128的对应包装类型的数组,存储ASCII码表上的所有字符对象,如果在范围内,拿数组中对象进行复用,
* 如果不在范围内,new新的该类型的对象
*
* 包装类布尔型的特殊数据:
* 在底层缓冲了两个Boolean对象,分别存储true和false,如果使用拿对应的对象进行复用
String类的笔试题1:
* 比较字符串的地址值
*
* 字符串的字面值常量存储于内存中的"字符串常量池"