tips:shift+F6 批量更改名字
扩展知识
HashMap源码分析
resize()——扩容
IO流
输入输出流,用来进行设备之间的一个数据输出
- 网络:上传下载,本地:读写文件
— 数据以文件形式体现的
— 文件传输过程中,还会出现一些异常需要处理
准备知识
- Java中的异常机制
- 文件 File
异常机制:
背景:一人骑车中,车胎没气了,遇到问题,对这人来说是个小问题,选择解决or不解决;要是车胎没了,这个问题自己无法解决;要是出门前检查,发现车闸送了,必须解决,要不然不能上路
Throwable (translate:可扔) 问题:异常和错误的父类
问题子类:
- Error 错误,严重性问题,无法解决:eg内存溢出
- Exception 异常,一般性问题,可解决,在写程序中需要处理的就是异常
- 运行期异常:RuntimeException及其子类,发生现在程序过程中,可解决,也可不解决
- 编译器异常:非RuntimeException及其子类,发生在编译期间,不解决程序无法运行
运行期异常的默认处理方法是抛给jvm去处理,它默认会打印异常的堆栈信息,然后退出虚拟机;若用户觉得JVM默认处理异常的方式不友好,可自己捕获异常自己处理:
- 使用关键字:try{}catch()
try{
//try里面放的是,有可能出现的代码,一旦出现异常,就会执行catch中的代码;若try中没遇到异常,那么catch中代码不执行
System.out.println(a/b);
}catch(ArithmeticException e){
System.out.println("打印除数为0");
}
- Ctrl+H 看一个类的继承关系
- 右键 -》Diagrams
try{
System.out.println(arr[3]);
System.out.println(a/b);
}catch(ArrayIndexofBoundsException e){
System.out.println("数组角标越界");
}catch(ArithmeticException e){
System.out.println("打印除数为0");
}
-
catch 可以并列写多个,捕获不同异常
catch(Exception e){ System.out.println("其他异常"); }//捕获所有异常,但不知道到底是什么异常
-
注意,能明确的异常类型,尽量明确
tips:若用户捕获的异常是平级关系,谁前谁后无所谓,如过异常之间有继承关系,子类在前,父类在后
——用Scanner中注意:
在使用完scanner之后应该释放资源:scanner.close()
Scanner scanner = null;
try{
sc=new Scanner(System.in);
System.out.println();
int a = sc.nextInt();
System.out.println();
int b = sc.nextInt();
System.out.println(a/b);
// sc.close();
}catch(ArithmeticException e){
System.out.println("打印除数为0");
e.printStackTrace();
//打印异常的堆栈信息
}finally{
System.out.println("finally里面的代码,不管try里面有没有遇到异常,都会执行");
if(sc!=null){
//判断输入是否为空,不是空再释放
sc.close();
}
}
在finally里面喜欢做一些善后工作,比如释放资源
- 异常不只是打印出来,还可以做一些业务逻辑:
eg:
whlie(true){
Scanner sc=new Scanner(System.in);
System.out.println("输入整数");
try{
int num=sc.nextInt();
System.out.println(num);
break;
}catch(InputMismatchException e){
System.out.println("请再次尝试输入整数");
}
}
编译期异常:
处理方式:
-
抛给调用者处理,谁调用谁处理,简称甩锅——throws
-
自己捕获处理
-
throws—用在方法内部进行抛出
throw new ArithmeticException(”除数为0“)
eg:
public class MyTest {
public static void main(String[] args) throws CloneNotSupportedException{
try {
hehe();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("========");
}
public static void hehe() throws ParseException{
new SimpleDateFormat("yyyy-MM-dd").parse("2017:11-11");
}
}
class Dog implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
快捷键演示:
运行期异常:选中可能有问题的代码,用Ctrl + Alt +t,自动生成
编译期异常:Alt+Enter 万能纠错键;选择抛出或捕获
**tips:**throws与throw区别
- throws 用在方法声明上,是抛出多个异常的类型,抛出的只是一中发生该类异常的可能性,并不会一定发生
- throw 用在方法内部,它只能抛出一个异常对象,一个具体的异常对象,一旦抛出,就说明发生了这种情况
自定义异常
——当Java提供的这些异常类并不能完全描述,在开发中所要描述的异常,那么就需要自定义异常
eg:
//模拟银行取款余额异常
public class MyTest {
public static void main(String[] args) {
//自定义异常;当Java提供的这些异常类,并不能完全描述,我在开发中所要描述的异常,那么就需要我们自定义异常
int num = 100;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的取款金额");
int money = scanner.nextInt();
if (money <= num) {
num -= money;
} else {
// System.out.println("余额不足");
//我想要抛出一个余额不足异常
throw new NoMoneyException("余额不足");
}
}
}
public class NoMoneyException extends RuntimeException{
public NoMoneyException(String msg) {
super(msg);
}
}
子类父类的异常
——子类在重写父类方法时,方法内部出现编译期异常,若父类方法没有throws该异常,子类就不能抛出;
——子类不能抛出父类没有抛出过的异常;
——父类有抛出异常,子类可以不抛出;
——子类抛出的异常不能比父类 大,只能比父类的小或一样
File
IO:输入输出流,用来进行设备之间的一个数据传输,那么在传输过程总就可能会有异常出现,需要处理,so先学异常机制
Java提供了一个类:File 来描述文件和目录
构造方法:
new File();
路径:
——绝对路径;带有盘符号的详细路径
——相对路径:不带有盘符号的路径(项目文件夹的根目录)
创建文件,返回值的意思为文件是否创建成功
file.createNewFile();
——第一次创建文件时,创建成功返回true
——文件已经存在,重复创建返回false
如何创建目录
file.mkdir();
——返回值 是目录是否创建成功
——文件夹已经存在,重复创建返回false
——只能创建单级目录
file.mkdirs();——创建单级或多级目录
删除文件与文件夹
先封装,再删除
file.delete();——返回删除成功与否
delete();——不能直接删除多级目录(用递归从里面开始删处)
重命名
renameTo();
——重命名文件:传入的这个新文件和旧文件路径一致,只是文件名不一样,就会重命名
——剪切功能:传入的新文件和旧文件路径不一致,就会把旧文件剪切走
File file = new File("abc.txt");
File file2 = new File("E:\\abc.txt");
file.renameTo(file2);
判断功能
isFile();——判断是否为文件
isDirectory();——判断是否为目录
.canWrite();——可写
.canRead();——可读
.isHidden();——是否隐藏
file.canExecute();——Linux下判断文件是否执行
与获取相关的方法
file.length()——获取文件的字节数
file.getName()——获取文件名
file.getParent()——获取文件的父路径(返回字符串形式)
file.getParentFile()——获取文件的父路径(返回File类型)
file.getAbsoluteFile()——获取文件的绝对路径(返回File类型)
file.getAbsolutPath()——获取文件的绝对路径(返回字符串形式)
file.getPath()——获取文件的相对路径(返回字符串形式)
file.getTotalSpace()——获取磁盘的大小(单位字节)
file.getFreeSpace()——获取剩余容量
file.lastModified()——获取文件最后一次修改时间(单位是毫秒值)
file.exists()——判断文件在不在
file.list()——获取指定目录下的所有文件或者文件名的名称数组,返回字符串数组,遍历数组(不灵活)
file.listFiles()——获取指定目录下的所有文件或者文件夹的File数组
过滤的方法,根据此方法的返回值进行过滤,返回false不往数组里面装
new FilenameFilter(){}