异常
1、异常就是"不正常"的含义,在Java语言中主要指程序执行中发生的不正常情况。
2、java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类。其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了等。
3、其中Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决,
如:0作为除数等。
异常的分类
1、java.lang.Exception类是所有异常的超类,主要分为以下两种:
RuntimeException - 运行时异常,也叫作非检测性异常
IOException和其它异常 - 其它异常,也叫作检测性异常,所谓检测性异常就是指在编译阶段都能
被编译器检测出来的异常。
2、其中RuntimeException类的主要子类:
ArithmeticException类 - 算术异常
ArrayIndexOutOfBoundsException类 - 数组下标越界异常
NullPointerException - 空指针异常
ClassCastException - 类型转换异常
NumberFormatException - 数字格式异常
3、注意:
当程序执行过程中发生异常但又没有手动处理时,则由Java虚拟机采用默认方式处理异常,而默认
处理方式就是:打印异常的名称、异常发生的原因、异常发生的位置以及终止程序。
异常的捕获
1、语法格式:
try {
编写可能发生异常的代码;
}catch(异常类型 引用变量名) {
编写针对该类异常的处理代码;
}finally {
编写无论是否发生异常都要执行的代码;
}
2、注意事项
a.当需要编写多个catch分支时,切记小类型应该放在大类型的前面;
b.懒人的写法:
catch(Exception e) {}
c.finally通常用于进行善后处理,如:关闭已经打开的文件等。
3、执行流程
try {
a;
b; - 可能发生异常的语句
c;
}catch(Exception ex) {
d;
}finally {
e;
}
当没有发生异常时的执行流程:a b c e;
当发生异常时的执行流程:a b d e;
手动处理异常和没有处理异常的区别:代码是否可以向下执行
笔试考点:
// 笔试考点
public static int test() {
try {
int[] arr = new int[5];
System.out.println(arr[5]);
return 0;
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
return 1;
} finally {
return 2; // 提交结束方法并返回数据,返回2
}
}
异常的抛出
1、在某些特殊情况下有些异常不能处理或者不便于处理时,就可以将该异常转移给该方法的调用者,
这种方法就叫异常的抛出。当方法执行时出现异常,则底层生成一个异常类对象抛出,此时异常代
码后续的代码就不再执行。
2、方法重写的原则
a.要求方法名相同、参数列表相同以及返回值类型相同,从jdk1.5开始支持返回子类类型;
b.要求方法的访问权限不能变小,可以相同或者变大;
c.要求方法不能抛出更大的或者是与其平行关系(可以抛出相同)的异常;
3、注意:
子类重写的方法不能抛出更大的异常、不能抛出平级不一样的异常,但可以抛出一样的异常、更小
的异常以及不抛出异常。
4、经验分享
a.若父类中被重写的方法没有抛出异常时,则子类中重写的方法只能进行异常的捕获处理。
b.若一个方法内部又以递进方式分别调用了好几个其它方法,则建议这些方法内可以使用抛出
的方法处理到最后一层进行捕获方式处理。
自定义异常
1、当需要在程序中表达年龄不合理的情况时,而Java官方又没有提供这种针对性的异常,此时就需要
程序员自定义异常加以描述。
2、实现流程
a.自定义xxxException异常类继承Exception类或者其子类。
b.提供两个版本的构造方法,一个是无参构造方法,另外一个是字符串作为参数的构造方法。
3、异常的产生
throw new 异常类型(实参);
如: throw new AgeException(“年龄不合理!!!”);
File类
方法声明 | 功能介绍 |
---|---|
File(String pathname) | 根据参数指定的路径名来构造对象 |
File(String parent, String child) | 根据参数指定的父路径和子路径信息构造对象 |
File(File parent, String child) | 根据参数指定的父抽象路径和子路径信息构造对象 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在 |
String getName() | 用于获取文件的名称 |
long length() | 返回由此抽象路径名表示的文件的长度 |
long lastModified() | 用于获取文件的最后一次修改时间 |
String getAbsolutePath() | 用于获取绝对路径信息 |
boolean delete() | 用于删除文件,当删除目录时要求是空目录 |
boolean createNewFile() | 用于创建新的空文件 |
boolean mkdir() | 用于创建目录 |
boolean mkdirs() | 用于创建多级目录 |
File[] listFiles() | 获取该目录下的所有内容 |
boolean isFile() | 判断是否为文件 |
boolean isDirectory() | 判断是否为目录 |
File[] listFiles(FileFilter filter) | 获取目录下满足筛选器的所有内容 |
public class FileTest {
public static void main(String[] args) {
// 1、构造File类型的对象与d:/a.txt文件关联
File file = new File("d:/a.txt");
// 2、若文件存在则获取文件相关信息并打印然后删除
if (file.exists()) {
System.out.println("文件名:" + file.getName());
System.out.println("文件长度:" + file.length());
System.out.println("文件最后一次修改时间:" + file.lastModified());
// 绝对路径: 主要指以根目录开始的路径信息,如:c:/ d:/ /..
// 相对路径: 主要指以当前目录所在位置开始的路径信息,如:./(当前目录) ../(当前目录的上级目录)
System.out.println("文件绝对路径信息:" + file.getAbsolutePath());
file.delete();
}else {
// 3、若文件不存在则创建
try {
boolean newFile = file.createNewFile();
if (newFile){
System.out.println("文件创建成功");
}
} catch (IOException e) {
System.out.println("文件创建失败");
e.printStackTrace();
}
}
// 4、创建单级目录和删除目录
File file1 = new File("d:/目录");
if (file1.exists()) {
System.out.println("目录的名称:" + file1.getName());
System.out.println(file1.delete()? "目录删除成功" : "目录删除失败");
} else {
System.out.println(file1.mkdir()? "目录创建成功" : "目录创建失败");
}
// 5、创建多级目录
File file2 = new File("d:/爷爷/爸爸/儿子");
System.out.println(file2.mkdirs()? "创建多级目录成功" : "创建多级目录失败");
// 6.实现目录中所有内容获取的同时进行过滤
// 匿名内部类的语法格式:接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };
/*FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File pathname) {
// 若文件名是以.avi为结尾,则返回true表示保留 否则返回false就是表示丢弃
return pathname.getName().endsWith(".avi");
}
};*/
// Lambda表达式的格式:(参数列表) -> {方法体}
FileFilter fileFilter = (File pathname) -> {return pathname.getName().endsWith(".avi");};
File[] filesArray2 = f3.listFiles(fileFilter);
for (File tf : filesArray2) {
System.out.println(tf);
}
}
}