01_异常的概述和分类
异常:
- 概述: 程序出现不正常的情况就是异常.
分类: //理解
- Error: 错误
- 服务器宕机, 数据库崩溃
- Exception: 异常, 这个才是我们常说的异常
- 编译期异常: 非RuntimeException及其子类
- 运行时异常: RuntimeException及其子类
- Error: 错误
- 案例: 老王骑车去西藏
- a.肚子疼 // 异常
- b.车胎爆了 // 异常
- c.前方有山洪,地震 // 错误
- d.路上好多小石子,比较坎坷 // 异常
- e.自行车丢了 // 错误
02_编译期异常和运行时异常的区别
- 编译期异常:
- 必须处理, 才能通过编译.
- 运行时异常:
- 不用处理, 也能通过编译.
03_异常的两种处理方式以及区别
异常的处理方式
方式一: try-catch-finally 语句
格式:
try {
// 尝试要执行的代码
} catch(异常类型 对象名) {
// 遇到异常后的处理代码
} finally {
// 一般是用来释放资源的,正常情况下,里边的代码永远会执行.
}
方式二: throws 声明抛出异常
* 异常的处理方式有几种,他们之间有什么区别? * try-catch-finally: 处理完后, 程序会接着执行. * throws: 处理完后, 程序会终止运行.
04_finally关键字
- finally关键字:
- finally是try-catch-finally语句体的一个模块, 一般是用来释放资源的, 正常情况下, 里边的代码永远会执行.
05_finally关键字的面试题
题目一: 分析如下代码, 看方法的返回值是什么?
public static int method1() {
int num = 10;
try {
System.out.println(1/0);
num = 20;
System.out.println(“我是try中的输出语句”);
} catch (Exception e) {
num = 30;
return num; //30} finally{ num = 40; System.out.println("我是finally中的输出语句"); } return 50;
}
题目二: 如果catch中有return, finally里边的代码会不会执行? 如果会, 只在return之前还是之后?
- 会, 在return之前.
- 注意:
- 其实严格意义上来讲, 是在return之间, 因为return做了两件事:
- 看见return后, 会先创建一个返回路径记录当前要返回的值;
- 返回当前的值, 在返回之前, 会先执行finally中的代码.
06_File类简介及构造方法
概述:
- 用来操作文件或者文件夹的.
- 大白话: 其实是用来操作路径的.
构造方法:
- 直接传入文件(夹)的路径
- File file1 = new File(“D:\bbb\a.txt”);
- System.out.println(file1.isFile());
- 传入父目录(String) 和 子文件(夹)名
- File file2 = new File(“D:\bbb”, “a.txt”);
- System.out.println(file2.isFile());
- 传入父目录(File) 和 子文件(夹)名
- File file3 = new File(“D:\”);
- File file4 = new File(file3,”a.jpg”);
- System.out.println(file4.isFile());
- 直接传入文件(夹)的路径
学File类的小技巧, 先搞定几个单词, 再学起来就事半功倍了:
- file: 文件
- directory: 文件夹
- path: 路径
- absolute: 绝对
07_绝对路径和相对路径
绝对路径和相对路径的区别:
- 绝对路径: 固定的写”死”的路径, 一般是以盘符开头.
- 相对路径: 一般是相对于当前项目(的路径)来讲的.
08_File类的创建和删除功能
* 创建功能:
* createNewFile(); //创建文件, 不存在就创建并返回true, 存在就不创建返回false
* mkdir(); //创建单级文件夹, 不存在就创建并返回true, 存在就不创建返回false
* mkdirs(); //创建多级文件夹, 不存在就创建并返回true, 存在就不创建返回false
* 删除功能:
* delete(); //删除文件(夹) 注意:Java中的删除不走回收站,要删除的文件夹必须为空。
09_File类的获取功能
* 获取功能
* length(); //只能统计文件的大小,单位是字节。如果统计文件夹的大小,结果可能不是你想要的.
* getName(); //获取文件(夹)名字
* getAbsolutePath(); //获取绝对路径的字符串形式
* getAbsoluteFile(); //获取绝对路径的 File对象形式
* getPath(); //创建File对象的时候,用的是什么路径就返回什么路径.
//一般是用来获取相对路径的.
* getParent(); //获取文件(夹)的父目录的 字符串形式
* getParentFile(); //获取文件(夹)的父目录的 File对象形式
10_File类的判断功能
* 判断功能
* exists(); //判断文件(夹)是否存在
* isFile(); //判断是否是文件
* isDirectory(); //判断是否是文件夹
11_File类的list()&&listFiles()
* String[] list(); //获取指定目录下所有的文件(夹)的名称数组
* File[] listFiles(); //获取指定目录下所有的文件(夹)的对象数组
12_匿名内部类
* 格式:
new 类名或者接口名() {
//重写所有的抽象方法
};
* 本质:
* 大白话解释: 其实就是一个类或者接口 的子类对象.
13_文件名称过滤器(理解)
* 获取D盘下, 所有后缀名为.jpg的文件.
* 思路一: 先获取所有, 然后遍历获取指定文件.
* a.通过listFiles()获取到D盘下所有的文件(夹)对象.
* b.遍历, 获取到每一个File对象.
* c.然后判断是否是后缀名为.jpg的文件,
* 如果是就打印,不是就什么都不操作.
* 思路二: 在获取的时候, 直接获取符合要求的文件.
* 通过文件名称过滤器实现.
* 文件名称过滤器:
* String[] list(FilenameFilter ff); //文件名称过滤器
* File[] listFiles(FilenameFilter ff); //文件名称过滤器
14 递归:
概述:方法自己调用自己
// StackOverflowError: 栈内存溢出
注意事项:
1.递归调用方法的次数不能太多,否则会栈内存溢出
2.递归一定要有出口,否则会栈内存溢出
3.构造方法不能递归
15 遍历指定路径下的所有文件(包括子目录\子子目录下的文件)
public static void findFileAndDirectory(String path) {
// 1.把传入的路径封装成一个File对象
File file= new File(path);
// 2.获取该路径下的所有的子文件\子文件夹
File[] files = file.listFiles();
// 3.遍历获取到的所有子文件\子文件夹;
if(files != null) {
for(File file2 : files) {
if(file2.isFile()) {
System.out.println(file2);
}
if(file2.isDirectory()) {
// 递归
findFileAndDirectory(file2.getAbsolutePath());
}
}
}
}
16 遍历指定路径下的所有.jpg文件(包括子目录\子子目录下的文件)
public static void findJpgFile(String path) {
// 1.把出入的路径封装成一个File对象
File file = new File(path);
// 2.获取该路径下的所有的子文件\子文件夹
File[] listFiles = file.listFiles();
// 3.遍历获取到的所有子文件\子文件夹;
if(listFiles != null) {
for(File file2 : listFiles) {
// 如果是文件
if(file2.isFile() &&file2.getName().endsWith(".jpg")) {
System.out.println(file2);
}
if(file2.isDirectory()) {
findJpgFile(file2.getAbsolutePath());
}
}
}
}
17 计算文件夹的大小
public static long getDirectorySize(String path) {
// 1.把传入的路径封装成一个File对象
File file = new File(path);
// 2.获取该路径下的所有子文件\子文件夹
File[] files = file.listFiles();
long countSize = 0;
// 3.遍历获取到的所有子文件\子文件夹
if(files != null) {
for(File file2 : files) {
if(file2.isFile()) {
// 每遍历到一个文件,就计算该文件的大小,然后累加
long len = file2.length();
countSize += len;
}
if(file2.isDirectory()) {
// 递归
countSize += getDirectorySize(file2.getAbsolutePath());
}
}
}
return countSize;
}