Day17
一、异常(在程序运行的时候发生的错误,Throwable是异常的一个超类)
1、异常的体系结构:Error,Exception是Throwable的直接子类;
- Error很严重的错误,一般是jvm报的错误,需要修改源代码;
- Exception不是很严重的错误,但必须解决;
- RuntimeException运行时异常是Exception的一个重要的直接子类,但不需要开发人员处理,由jvm处理;
2、jvm自带处理异常机制:
- 将异常的信息(时间、地点等)打印出来;
- 将程序终止;
如果程序发生异常,没有任何方法或类去处理这个异常,最后交由jvm来处理
3、手动处理异常
(1)抛出异常,让调用者去处理异常(捕获或抛出)
(2)程序员自己处理异常(关键字try、catch、finally、throw、throws):
第一种方法:try{ 有可能发生异常的代码 }catch(异常类型 异常对象){ 一般打印异常信息 }
- 执行的流程:没有发生异常,执行try里的代码==>执行完毕(不执行catch),发生异常后,从异常处直接跳到catch代码块
- 处理多个异常:try{ 有可能发生异常的代码 }catch(异常类型1 异常对象){ 代码块1 }……catch(异常类型n 异常对象){ 代码块n }(满足catch异常类型才执行catch的代码块,且异常类型由小及大)
第二种方法(最常用):try{ 有可能发生异常的代码 }catch(异常类型 异常对象){ 一般打印异常信息 }finally{ 不管发不发生异常都会执行这个代码块 }
- 如果遇到return,先执行完finally里的代码,然后执行return,只有System.exit(0)杀死jvm才能不执行finally
- finally代码块一定会执行的特点,所以在关闭与释放资源有很大作用(IO流的关闭)
- 在jdk1.7之后,catch()括号里可以存在多个异常,使用“|”链接
- 在开发中,如果有多个异常,最后都会捕获一个最大异常Exception
- 捕获异常,如果具体到某一种类型的异常,尽量具体,方便解决问题
第三种方法(不常用):try{ 可能发生异常的代码 }finally{ 不管发不发生异常都会执行的代码 }
- 并没有具体捕获异常,只是让代码分离,结构比较清晰
(3)异常分类:
- 编译时异常:也就是在代码运行之前就会报错;
- 运行时异常:RuntimeException在.class文件在运行时jvm发出的异常,是Exception的直接子类;
- 常见的一些异常:rithmeticException算术异常;ParseException格式转化异常错误;java.lang.NullPointerException空指针异常;
(4)Throwable异常常规方法(子类没有特别的方法):
- public StackTraceElement[] getStackTrace():打印其堆栈信息(也就异常信息);
- public String getMessage():返回此异常的详细消息字符串;
- public String toString():返回此异常的简短描述;
(5)throw:异常的声明(可以在方法里声明自己想声明的异常)
- 声明异常格式:throw(关键字)+具体的异常类型
- 声明的异常必须写在方法里,必须是Exception类或其子类,如果是运行时异常可以不处理,其他的都要处理
(6)throws:抛出异常(格式:throws+异常类型),必须写在方法括号后,必须是Exception或其子类
throw和throws的区别:
- throw是声明,后面处理异常或抛出;throws就是抛出异常
- throw声明确实会发生的异常,throws抛出的不一定会发生异常
- throw后面只能声明一个异常,throws可以抛出多个异常
(7)自定义异常,继承父类一般分两种情况:继承Exception(常用)或继承RuntimeException
二、File(文件类)是一个文件对象和目录路径的抽象表现形式,在java.io包下
1、路径:绝对路径(具体到盘符),相对路径(相对参照物)
2、Windows的根路径是盘符,Unix的根路径是斜杠(\)
注意点:File类的实例是不可变的,一旦创建,对象表示的抽象路径名不可改变,因为只能通过构造器给对象路径
3、File对象的构造方法:
- public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例;
- public File(String parent,String child):parent表示父级目录路径(字符串),child 表示子目录(字符串);
- public File(File parent,String child):parent表示父级目录路径(文件对象),child 表示子目录(字符串);
注意点:只要存在父子关系,必须父目录存在
4、常规方法:
(1)创建:
- createNewFile():创建文件的方法;
- public boolean mkdir():创建一个文件夹;
- public boolean mkdirs():如果父目录不存在,一同创建父目录;
- public boolean delete():删除一个文件或空的文件夹(删除的文件不会进入电脑垃圾回收站);
- public boolean renameTo(File dest):重命名文件(如果在同一个目录下,是修改其名字,如果不在同一个的目录下是剪切+修改名字);
(2)判断:
- public boolean exists():判断这个文件是否存在;
- public boolean isDirectory():判断是否是文件夹;
- public boolean isFile();是否是一个文件;
(3)获取:
- public String getAbsolutePath():获取文件的其绝对路径;
- public String getPath():获取构造方法传递的那个参数的路径(new File(“d:\1.txt”));
- public String getName():获取文件的名称;
- public String getParent():返回上一级目录;
- public long length():文件内容的的长度(字节数);
- public String[] list();返回的是改目录下的第一级的所有文件包括文件夹;