异常与文件小结
一.异常:
1.概述与分类:
1.1.概述:
所谓异常就是指程序运行过程中出现的错误,异常的所有对象都是派生于Throwable类的实例。
1.2.继承体系:
1.3.分类:
RuntimeException:
1.错误的强制类型转换
2.数组访问越界
3.访问null指针
不是派生于RuntimeException的异常包括:
1.试图超越文件末尾继续读取数据
2.试图打开一个不存在的文件
3.试图给根据给定的字符串查找class对象,而这个字符串表示的类并不存在
2.抛出异常:
2.1步骤总结:
1.找到合适的异常类
2.创建这个类的一个对象
3.将对象抛出
一旦方法抛出了异常,该方法就不会返回到调用者,即不用担心建立一个默认的返回值或错误码
举个例子:
public class Test2 {
public static void main(String[] args) {
new Test2().test(1,0);
}
//假设这个方法中,处理不了这个异常,方法上抛出异常
public void test(int a,int b) throws ArithmeticException{
if(b==0){
throw new ArithmeticException();//主动的抛出异常,一般在方法中使用
}
}
}
2.2.创建异常类:
代码可能会遇到任何标准异常都无法描述清楚的问题,所以我们可以创建自己的异常类,只需要定义一个派生于Exception的类,或其子类
举个例子:
//自定义异常类
public class MyException extends Exception {
//传递数字>10
private int datail;
public MyException(){
}
public MyException(int a){
this.datail = a;
}
//toString : 异常的打印信息
@Override
public String toString() {
return "MyException{" +
"datail=" + datail +
'}';
}
}
注意:
如果调用了一个抛出检查型异常的方法,就必须处理这个异常,或者继续传递这个异常。注意:传播异常必须在方法的首部添加一个throws说明符,提醒调用者这个方法可能会抛出异常。
Trowable中的常见方法:
Throwable() :构造一个新的Throwable对象,但没有详细的描述信息
Throwable(String message) :构造一个新的Throwable对象,带有指定的详细描述信息
String getMessage():获得Throwable对象的详细描述信息
3. 异常的捕获:
3.1.捕获异常:
想要捕获一个异常,需要设置try…catch语句
基本格式:
try
{
//监视代码的执行过程,若有异常则会跳转至catch语句
//若无异常,则执行完改代码块后,会跳过catch
}
catch(报错原因)
{
//出现异常直接跳转至改代码块,将异常处理或者抛出
}
3.2.捕获多个异常
在一个try语句中,可以捕获多个异常类型,需要对不同的类型做出不同的处理,可以使用多个catch语句,且当捕获异常类型彼此之间不存在子类关系
语法:
try{
// 可能会出现问题的语句
}catch(报错原因){
//catch中要将小的异常放在前面,大的异常放在后面,否则大的会将所有子类全部接受,子类的存在就毫无意义
}catch(报错原因){
}
3.3.再次抛出异常与异常链
当希望改变异常类型的时候,可以在catch子句中抛出一个异常。
3.4.finally子句
当代码中抛出一个异常时,会停止处理这个方法中剩余的代码,并退出这个方法。但若这个方法已经获得了一些只有自己知道的资源,且这个资源必须得到处理,如果退出就会产生一些问题。所以使用finally子句,无论是否有异常被捕获,都会执行finally子句中的代码。
finally一般用于释放资源
举个例子:
public static void main(String[] args) {
int a = 1;
int b = 1;
//注意捕获异常时,要从小到大
try { // try监控区域
System.out.println(a/b);
}catch(ArithmeticException e){ // catch捕获异常 (捕获异常类型)
System.out.println("程序出现异常,变量b不能为0");
}finally{ //处理善后工作,处理IO流,资源等,可关闭。此处可不要,
System.out.println("finally");
}
}
注意:
1、try语句后面的catch,finally可以没有,但不能同时没有。
当没有catch语句的时候,,程序会先执行完try中所有的语句,直至抛出异常位置,跳过try语句语块中剩余的代码,然后执行finally子句中的语句,并将异常抛出给方法的调用者
2.当catch与finally同时存在的时候:finally必须使用在所有catch的最后位置,常用来处理一些后续的工作
4.补充:
4.1.throw与throws的区别:
throw : 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,用throw将对象抛出一个具体的异常类型
1.在方法体类,跟异常对象名
2.只能抛出一个对象名
3.表示抛出异常,由方法体内的语句处理
throws : 用来声明一个方法可能产生的所有异常,不做任何异常处理而是将异常往上传,抛给调用者
1.方法声明后,跟在异常类名
2.跟多个异常类名时,用逗号隔开
3.抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常
4.2.在子类继承父类的时候:
1.出现异常:子类的异常小于等于父类
2.被重写的方法没有异常抛出,那么子类的方法绝不可以抛出异常,如果子类的方法内有异常发生,那么子类只能try,不能throws.
一般就是捕获知道该如何处理的异常,继续传播不知道怎么处理的异常
4.3 finally与return:
1.即使在finally执行之前已经return返回值,finally也会执行。
2.当try或catch中return已经返回值,会将值保存在局部变量中,再去执行finally中的语句,最后返回局部变量中的值。
3.当try、catch中有return语句,且finally中也有return语句时:先执行try,catch中return语句,最后finally中return会覆盖局部变量中try或catch的return值。
二.File类:
1.构造方法:
File (String pathname):根据一个路径得到file对象
File (String parent,String child):根据一个目录和一个子目录/文件得到file对象
File (File parent,String child):根据一个父类file对象,和一个子文件/目录得到File对象
2.创建功能:
public boolean creatNewFile()//创建文件,如果文件存在就不创建;文件创建成功则返回true,否则false
public boolean mkdir()//创建文件夹,如果存在就不创建,返回类型同上
public boolean mkdirs()//创建文件夹,如果父文件夹不存在,则创建
在创建文件与文件夹时,如果忘记添加盘符路径,则默认在该项目路径下
3.文件的重命名和删除:
public boolean renameTo(File dest)//文件重命名为指定的文件路径
public boolean delect()//删除文件或者文件夹
在重命名时,若路径相同,则是改名,否则是改名并剪切;
在文件或者文件夹删除时,该文件内不能包含文件或者文件夹
4.文件的判断:
public boolean isDirectory()//判断是否是目录
public boolean isFile()//判断是否是文件
public boolean exists()//判断是否存在
public boolean canRead()//判断是否可读
public boolean canWrite()//判断是否可写
public boolean Hidden()//判断是否隐藏
5.获取功能:
public String getAbsolutePath()//获取绝对路径
public String getPath()//获取路径,构造方法里传入路径
public String getName()//获取名称,文件或者文件夹的名称
public long length()//获取长度或者字节数
public long lastModified()//获取最后一次修改时间
public String[] list()//获取指定目录下所有文件或者文件夹的名称数组
public File[] listFiles()//获取指定名录下所有文件或者文件夹的File数组