异常体系
JVM如何处理异常
JVM如何处理异常:
1. 程序立刻终止 -> 重要
2. 打印异常信息:
a. 异常的类型 : java. lang. ArithmeticException
b. 异常产生的原因: / by zero
c. 异常产生的代码位置: at com. atguigu. a_exception. Demo1. main ( Demo1 . java: 9 )
d. 红色字体打印异常信息
e. 异常产生的线程 : Exception in thread "main"
3. 开启了新的线程打印异常信息
4. 异常产生后, JVM会在内存中创建一个此异常类型的对象
自己处理异常的方式一 : 抛出去
自己处理异常的方式一 : 抛出去 -> 是你以前一直使用的方式, 也是现阶段最为推荐处理方式
抛出去 : 抛给调用者处理( 如果调用者一直不处理, 最终才抛给了JVM)
格式:
方法的声明( 形参列表) throws 异常的类名{
}
运行时期异常抛出去处理: 无意义 -> 不管就够了
编译时期异常抛出去处理: 有意义
编译时期异常出现了, 在写代码的时候必须去处理, 而抛出去是一种处理手段!
如果方法内有编译时期异常, 调用方法时调用方法的方法也要处理这个编译时期异常.
如果所有的方法都选择抛出处理, 那么最终一定交付给JVM处理异常;
注意事项:
1. 当方法声明上抛出了父类异常, 那么他的所有子类异常都不需要抛出了
2. 一个方法上可以同时抛出多个异常, 多个异常之间使用 , 分隔
自己处理异常的方式二 : 包起来
自己处理异常的方式二 : 包起来 -> 未来阶段最为推荐的处理方式 -> 不会影响程序往后执行! !
包起来 : 程序员自己处理异常
格式:
try {
可能会出现异常的代码;
} catch ( 异常类型 对象名) {
自己处理异常的手段;
}
运行时期异常 被包裹 -> 有意义, 程序不会中断, 还会继续执行其他代码
编译时期异常: 包起来 -> 有意义, 程序不会中断, 还会继续执行其他代码, 不需要再方法上抛出异常!
try…catch
try . . catch : 是异常处理方式包起来的格式框架
格式:
try {
可能会出现异常的代码;
} catch ( 异常类型 对象名) {
自己处理异常的手段;
}
执行流程:
1. try 中无异常 : 按照程序的自然流程执行代码, 不执行catch 中的代码
2. try 中有异常, catch 捕获到了:
遇到try 中异常代码, 立刻终止了try 中代码执行
进入到catch 中的代码执行
执行完catch , 执行try . . catch 结构后的代码 -> 也不会提前终止整个程序
3. try 中有异常, catch 没有捕获到
遇到try 中异常代码, 立刻终止了try 中代码执行
因为catch 没有捕获到异常, JVM介入处理异常
try…catch捕获到异常的执行流程图
try…catch的注意事项
1. 一个catch 只能捕获一个类型的异常
2. 一个try 可以对应多个catch , 多个catch 中不可以捕获相同的异常类型
3. 下方的catch 捕获的异常类型必须是上方catch 捕获异常的父类型或者是不同类型
4. 上方catch 捕获的异常类型不可以是下方catch 捕获异常类型的父类型
5. 如果catch 捕获的是父类型异常, 那么所有的子类异常都被一并捕获
异常对象的功能
String getMessage ( ) : 异常产生的原因
String toString ( ) : 异常的类型 + 异常产生的原因
* void printStackTrace ( ) : 开启了新的线程用红色字体打印了异常的类型+ 异常产生原因+ 异常产生的位置
finally代码块
finally 代码块 : 在try . . catch 格式中叫 一定会执行的代码
格式:
try {
可能会出现异常的代码;
} catch ( 异常类型 对象名) {
自己处理异常的手段;
} finally {
一定会执行的代码;
}
JVM退出, finally 代码块不执行( 其他情况finally 是一定执行的! ! )
自定义异常类
定义步骤:
1. 定义类 类名-> XxxxxException
2. 思考你定义的异常类型是编译时期还是运行时期
编译时期 : extends Exception
运行时期 : extends RuntimeException
3. 自动生成2 个构造 : 无参构造 和 带有String 形参的构造方法
使用步骤:
1. 定义方法, 在方法内暴露异常对象
2. 在暴露异常对象之前要写 判断!
暴露异常对象的格式:
throw new 异常对象( ) ;
throw : 暴露异常对象 -> 方法内
throws : 抛出异常类型 -> 方法的声明上
如果方法内暴露的是一个编译时期异常, 那么需要立刻处理-- > 一定要选择抛出去! !
递归算法
递归算法 : 递进回归 -> 在方法内部调用方法自己( 这种写代码的手法叫递归)
从前有座山, 山里有座庙, 庙里有个老和尚, 老和尚给小和尚讲故事:
从前有座山, 山里有座庙, 庙里有个老和尚, 老和尚给小和尚讲故事:
从前有座山, 山里有座庙, 庙里有个老和尚, 老和尚给小和尚讲故事:
从前有座山, 山里有座庙, 庙里有个老和尚, 老和尚给小和尚讲故事:
. . . . .
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃
. . . . .
俄罗斯套娃, OBS. . .
递归的前提
1. 必须定义方法, 且方法必须有形参
2. 必须在方法内部调用方法自己
3. 必须有出口 -> 回归点
4. 在方法内部调用方法本身的时候, 需要有实际参数的变化( 变化的方向要往出口方向前进)
5. 递归的次数不能太多 -> StackOverflowError
快速排序的思路
File的概述
File : 代表的是计算机中所有的文件和文件夹! -> 计算机中除了文件就是文件夹! -> true
File的构造方法
File ( String pathname) : 传入文件/ 文件夹的路径封装一个file对象
File ( String parent, String child) : 传入字符串类型的子父路径封装一个file对象
File ( File parent, String child) : 传入File 类型的父路径和String 类型的子路径封装一个file对象
创建File 对象干了啥:
1. 创建了File 对象
2. 在堆内存中开辟了空间
3. 让file对象指向路径结尾的文件/ 文件夹
相对路径和绝对路径*
绝对路径 : 完整的文件/ 文件夹路径 就是绝对路径
C : \Users \Administrator \Desktop \aaa. txt -> 绝对路径
绝对路径 : 一定以盘符开头!
绝对路径 : 任何路径都可以表示
相对路径 : 以一个参照物作为起点, 往内找的路径叫相对路径
相对路径: 只能找到参照物内的路径
IDEA / Eclipse : project的路径 ( IO流体系中的相对路径起点)
相对路径 : 一定不是以盘符开头!
举例 :
绝对路径 : 地球: \\亚洲\\中国\\湖北省\\武汉市\\东湖高新区\\茅店山中路\\东湖网谷\\6 号楼\\4 楼\\尚硅谷\\404 教室\\谈斌;
相对路径 : 起点-> 东湖网谷 注意 : 一定是往相对路径的内部去找
6 号楼\\4 楼\\尚硅谷\\404 教室\\谈斌;
File类中的自定义常量
static String pathSeparator
static char pathSeparatorChar
static String separator
static char separatorChar
File的创建功能
* boolean createNewFile ( ) : 根据file对象指向的文件, 创建一个文件, 返回创建是否成功
boolean mkdir ( ) : 根据file对象指向的文件夹, 创建一个文件夹, 返回创建是否成功
* boolean mkdirs ( ) : 可以创建多级文件夹也可以创建单级文件夹
File的删除功能(了解)
boolean delete ( ) : 删除此抽象路径名表示的文件或目录。