异常和File类

异常

概述:
异常就是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);
    }
}


异常的注意事项

  1. 子类在重写父类的方法时,子类的方法必须抛出和父类一样的异常,或者是父类异常的子类。子类也可以不抛出异常
  2. 如果父类抛出了多个异常。子类只能抛出和父类相同的异常或者是父类异常的子集,子类不能抛出父类没有抛出的异常
  3. 如果被重写的方法没有异常的抛出,那么子类的方法不可以抛出异常,如果子类的方法中有异常产生,那么只能捕获,不能抛出。
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;
                }
            }
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值