异常
概述:
异常就是Java程序在运行过程中出现的错误
异常分为Error(错误)和Exception(小问题),错误一般是严重的问题,我们无法处理,我们只能处理一些小问题,也就是Exception。
图示:
异常又可以分为编译期异常和运行期异常。
编译期异常我们必须处理,如果不处理,那么程序就无法执行
运行期异常我们可以处理,也可以不处理
JVM的默认处理异常
JVM有一个默认处理异常的方式,在碰到异常后,它会在控制台打印出异常,以及异常的出现位置,同时会停止程序的执行
那么如果我们不想出现异常后停止执行程序,有两种方法。
异常的处理方法
第一种是使用try catch语句捕捉获取异常。
格式:
try{
可能会出现异常的代码;
}catch(异常名 变量名){
针对异常的处理办法;
}
如果出现多个异常那么我们可以在try语句后面写多个catch来捕获不同的异常。这么做要注意两点,第一能明确的异常要尽量明确,第二是如果异常出现了继承关系,那么小的要写在前面,大的写在最后面。如果大的写在前面,后面的catch语句就毫无意义。如果是平级关系,那么位置就可以随便。如果不确定还会发生什么异常,那么可以给最后catch(Exception e)。
也可以写一个catch,在括号内将异常用逗号隔开,那么做会让多的异常的处理方法是一致,不推荐使用。
第二种是直接抛出异常,这种针对编译期异常。在类的声明后面直接使用关键字throws抛出异常
throws 异常名
如果功能方法内部出现异常,程序就无法继续运行,又需要执行下面的代码,那我们也可以在方法内部将异常抛出,这时需要用到throw关键字抛出异常。
public class Demo2 {
public static void main(String[] args) {
int a=10;
int b=0;
show(a,b);
}
private static void show(int a,int b) {
if(b==0) {
throw new ArithmeticException("除数为0");
}else {
System.out.println(a/b);
}
}
}
throws和throw的区别:
thorws在方法的声明上抛出异常,throw在方法的内部抛出异常。
throws可以抛出多个异常,用逗号隔开。throw只能抛出一个异常对象。
throws表示抛出异常只是抛出一种可能性,不一定会发生异常。而throw是经过人为判断,一定会出现某个异常
throws抛出异常由该方法的调用者处理,throw抛出异常由方法内部代码处理。
Throwable中的常见方法:
- getMessage()
获取异常信息,并返回字符串形式 - toString()
获取异常类名和异常信息,并返回字符串形式 - printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
finally关键字
被finally控制的语句体一定会执行,前期是Java虚拟机没有停止。如果在finally语句执行之前JVM已经停止,那么语句就不会被执行。finally一般用来释放资源,用在捕获异常try catch语句之后。
final、finally和finalize的区别:
final是最终的意思,可以修饰类、方法和变量。被final修饰的类不能被继承,被修饰的方法不能重写,被修饰的变量变为常量
而finally用在捕获异常中,用于释放资源
finalize是Object类中的一个方法,用来回收垃圾。
自定义异常
虽然Java给我们提供了很多种不同的异常,可是在使用中这些异常是远远不够的,那么我们在编写程序的过程中会自己创建一个异常供我们使用,这时就引入了自定义异常。
自定义异常也是一种异常,它是由我们实际当中的需求而编写。自定义异常是一个类,我们在使用的时候大多都在方法内部抛出异常,也就是throw。这时我们需要一个自定义异常的对象,所以我们要在异常类中提供构造方法。
案例:银行取钱钱不够提示余额不足
import java.util.Scanner;
public class Demo {
static int money=1000;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要取出的钱");
int i = scanner.nextInt();
getmoney(money,i);
}
private static void getmoney(int money,int i) {
if(i>money){
throw new Money("您的余额不足");
}else {
money-=i;
}
}
}
public class Money extends RuntimeException {
public Money(String name) {
super(name);
}
}
异常的注意事项
- 子类在重写父类的方法时,子类的方法必须抛出和父类一样的异常,或者是父类异常的子类。子类也可以不抛出异常
- 如果父类抛出了多个异常。子类只能抛出和父类相同的异常或者是父类异常的子集,子类不能抛出父类没有抛出的异常
- 如果被重写的方法没有异常的抛出,那么子类的方法不可以抛出异常,如果子类的方法中有异常产生,那么只能捕获,不能抛出。
File类
File是文件或文件夹路径的抽象形式。此类用来提供对文件和文件夹的操作方法
File类中有三种构造方法,他们都是用来封装一个文件或者一个路径。
- File(String pathname)
根据传入的路径来封装文件或目录 - File(String parent, String child)
此构造方法需要传入两个参数,第一个参数时父路径,第二个是文件或目录的名字 - File(File parent, String child)
此构造方法需要传入一个File类对象和文件或是目录的名字。它先要封装一个父路径得到一个File类对象,再进行构造。等于是new两次,第一次传入父路径得到一个对象。第二次传入这个对象和子文件。
方法:
- public boolean createNewFile()
创建一个新的文件,只能创建不存在的文件,如果存在则创建失败 - public boolean mkdir()
创建单级目录 - public boolean mkdirs()
创建多级目录 - public boolean delete()
删除文件或目录,只能删除空目录 - public boolean renameTo(File dest)
文件或目录重命名,还有一个剪切作用 - public boolean isDirectory()
判断对象是否是目录 - public boolean isFile()
判断对象是否是文件 - public boolean exists()
判断文件或目录是否存在 - public boolean canRead()
判断文件是否可读 - public boolean canWrite()
判断文件是否可写 - public boolean isHidden()
判断文件是否隐藏 - public boolean isAbsolute()
判断是否使用绝对路径 - public String getAbsolutePath()
返回绝对路径的字符串 - public String getPath()
返回相对路径的字符串 - public String getParent()
返回父路径的字符串 - public File getParentFile()
返回父路径的File类型 - public long getTotalSpace()
获取该路径总容量 - public long getFreeSpace()
获取该路径的剩余容量 - public String getName()
获取文件或目录的名字 - public long length()
获取对象的字节大小 - public long lastModified()
返回最后一次修改时间 - public String[] list()
返回该路径下所有文件或文件夹名字组成的string类型数组 - public File[] listFiles()
返回该路径下所有文件或文件夹的File形式的数组
文件过滤器
文件过滤器,就是在我们使用listFiles()方法时,用来筛选出我们需要的文件,把不符合要求的文件排除在外,不放在数组中。它是在调用ListFiles()时,传入的一个对象。new FileFilter(),就是文件过滤器。它和我们之前TreeSet集合中用到的比较器类似。需要传入一个匿名内部类。当然如何筛选文件就要靠重写accept()方法,根据这个方法的返回值true或flase来判断要不要放入数组中。在方法中编写适合的代码来筛选出我们所需要的文件。
案例:在指定目录下获取所有以 .mp4 为后缀的文件
import java.io.File;
import java.io.FileFilter;
public class Test {
public static void main(String[] args) {
File file = new File("C:/test");
file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isFile()&&pathname.getName().endsWith(".mp4")){
return true;
}else{
return false;
}
}
});
}
}