[Java学习日记]异常处理、文件操作

目录

一.程序出错:Error与Exception

二.try-catch语句

三.异常中常见的方法(定义在最顶级的Throwable类内)

四.throws与throw

五.自定义异常:让控制台报错信息更加见名知意

六.File对象与创建

七.文件信息查看方法

八.文件操作方法

九.获取File下的内容并遍历

十.案例:遍历文件夹:需要注意无权限访问的文件夹,返回数组时会返回为空

十一.案例:删除多级文件夹

十二.案例:统计文件夹中有后缀名的文文件的个数

十三.案例:获取文件夹里面的文件大小,需要注意不要对文件夹使用length方法


测试使用的学生类:具有特殊的set方法,会抛出异常
public class Student {
    private String name;
    private  int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        if (!(name.length()>=2&&name.length()<=3)){
            System.out.println("2.在抛出自定义异常时,可以在new异常时使用有参构造返回错误信息");
            throw new NameFormatException(name+"长度有误,长度应该为2-3");
        }
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age>40||age<18){
            throw new RuntimeException(age+"年龄有误,应该为18-40");
        }
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 


 

一.程序出错:Error与Exception

Error对象:系统级别的错误,无需关注。

1.异常体系的最上层父类是?
异常体系的最上层父类是Exception

2.异常又分哪两种?
RuntimeException(运行异常:如数组越界) 与 其他异常(编译异常:如使用SimpleDateFormat的parse方法时)。
通过异常可以了解错误信息,作为一种特殊的返回值,通知调用着底层的执行情况

3.JVM发生运行异常的时候会做什么事情?
public class Demo271 {
    public static void main(String[] args) throws ParseException {
        System.out.println("3.在Student类里面,年龄不对时抛出异常(throw new 异常名(描述)),停止运行");
        System.out.println("在Java运行过程中出错时,JMV默认的处理也是如此:把异常名称原因位置输出控制台,并且停止程序");
        new Student().setAge(17);
    }
}


二.try-catch语句

1.区别于区别于JVM默认处理方式,使用try-catch处理可以让代码继续往下走,如果代码遇到错误,错误代码下面的代码还会执行吗?
2.有多种异常需要处理应该如何使用try-catch语句呢?
3.连续catch时,对异常的顺序有什么要求?
public class Demo272 {
    public static void main(String[] args) {
        try {
            System.out.println("1.逮到错误就直接到catch里面处理,try中错误代码后面的代码不会执行");
            new Student().setAge(17);

            System.out.println(2/0);
            int[] a  = new int[1];
            System.out.println(a[10]);
            String str = null;
            str.equals("");
        } catch (ArithmeticException|NullPointerException e){
            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        } catch (RuntimeException e){
            System.out.println("2.有多种可能出现的异常或者异常不确定可以连续catch");
            System.out.println("3.catch时,父类只能写在最后面");
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}


三.异常中常见的方法(定义在最顶级的Throwable类内)

1.异常对象输出信息(默认报错方式)?
2.如何获取异常的简短信息?
3.如何输出错误信息(红色字体)?
public class Demo273 {
    public static void main(String[] args) {
        try {
            System.out.println(1/0);
        }catch (ArithmeticException e){
            System.out.println("1.使用printStackTrace方法是控制台输出错误信息,能跟踪报错位置");
            e.printStackTrace();
            System.out.println("2.返回详细信息与返回简短信息");
            System.out.println(e);
            System.out.println(e.getMessage());
        }
        System.err.println("3.打印错误信息(红色字与黑色字所处顺序会变化,与多线程有关)");
    }
}


四.throws与throw

1.throws在什么位置使用?作用是什么?
2.throws在可能有运行时异常的时候需要声明吗?
3.throw在什么位置使用?有什么作用?
public class Demo274 {
    public static void main(String[] args) throws Exception{
        System.out.println("1.throws写在方法定义处表示声明一个异常,告诉调用者这个方法体里面可能会有那些异常");
        System.out.println("2.对于运行时期的异常可以省略不写,编译时产生的异常必须要声明");
        System.out.println("3.throw写在方法里面,抛出异常对象,交给调用者,并结束方法");
        throw new Exception();
    }
}


五.自定义异常:让控制台报错信息更加见名知意

1.自定异常类的步骤?
2.在抛出异常时,如何随控制台输出错误自己想输出的信息?
public class Demo275 {
    public static void main(String[] args) {
        System.out.println("1.定义异常类\n2.写继承关系\n3.空参构造与带参构造");
        Student student = new Student();
        student.setName("捷克罗姆");
    }
}
//编译异常继承Exception,运行异常就继承RuntimeException
public class NameFormatException extends RuntimeException{
    public NameFormatException() {
    }
    public NameFormatException(String message) {
        super(message);
    }
}


六.File对象与创建

1.File对象能够表示什么?一定需要是存在的吗?
2.有哪些方式能够创建File对象?
public class Demo276 {
    public static void main(String[] args) {
        System.out.println("1.file对象表示路径,可以是文件路径,也能是文件夹路径,可以不存在");

        String str = "JAVA基础\\src\\Day27\\MyTxt";
        String s = "a.txt";

        System.out.println("2.(1)使用一个String创建File对象");
        File file1 = new File(str);
        System.out.println(file1);

        System.out.println("(2)使用两个String创建File对象,自动补\\");
        File file2 = new File(str,s);
        //相当于
        file2 = new File(str+"\\"+s);
        System.out.println(file2);

        System.out.println("(3)使用一个file一个string创建对象");
        File file3 = new File(file1,s);
        System.out.println(file3);
    }
}


七.文件信息查看方法

1.判断是否存在,是文件还是文件夹
2.文件大小
3.文件路径
4.文件名
5.最后修改的时间
public class Demo277 {
    public static void main(String[] args) {
        String file =  "JAVA基础\\src\\Day27\\MyTxt\\a.txt";
        File f = new File(file);
        System.out.println("1.返回文件状态:是否存在,是文件还是文件夹");
        System.out.println(f.exists());
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());
        System.out.println("2.返回文件大小(length)(如果是文件夹,则返回不确定)");
        System.out.println(f.length());
        System.out.println("3.返回文件定义时的路径(getPath)与绝对路径(getAbsolutePath)");
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        System.out.println("4.返回文件名,也可以是文件夹名(getName)");
        f = new File("JAVA基础\\src\\Day27");
        System.out.println(f.getName());
        System.out.println("5.返回文件最后修改的时间");
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(f.lastModified())));
    }
}

 


八.文件操作方法

1.如如何创建新文件?如果文件已存在会发生什么?如果路径错误会发生什么?
2.如何创建单级目录?
3.如何创建多级目录?
4.如何删除文件?
5.如何删除文件夹?当文件夹里面有文件时能删除文件夹吗?
public class Demo278 {
    public static void main(String[] args) throws IOException {
        String str = "JAVA基础\\src\\Day27\\MyTxt";
        System.out.println("1.创建新文件:1.如果文件已经存在,则创建失败 2.如果找不到路径会报错");
        File file1 = new File(str,"b.txt");
        System.out.println(file1.createNewFile());

        System.out.println("2.创建单级目录");
        File file2 = new File(str,"directory1");
        System.out.println(file2.mkdir());

        System.out.println("3.创建多级目录(创建单级肯定也可以)");
        File file3 = new File(str,"directory2\\A");
        System.out.println(file3.mkdirs());

        System.out.println("4.删除文件");
        System.out.println(file1.delete());

        System.out.println("5.删除文件夹:有内容就删不掉");
        System.out.println(new File(str).delete());
        System.out.println(file3.delete());
    }
}


九.获取File下的内容并遍历

1.使用什么方法获取指定目录下的file数组?
2.不存在该目录时方法会返回什么?
3.为文件时方法会返回什么?
4.位空文件夹时该方法会返回什么?
5.该方法能够获取隐藏文件夹吗?
6.如何获取可用的系统根?
7.使用什么方法获取指定目录下的文件数组?(String类型)
8.在创建文件时如何过滤内容?
public class Demo279 {
    public static void main(String[] args) {
        File file = new File("Java基础\\src\\Day27");
        System.out.println("1.获取文件与文件夹的数组");
        File[] files = file.listFiles();
        System.out.println(files);

        System.out.println("2.不存在则返回空");
        file = new File("Java基础\\src\\Day1");
        System.out.println(file.listFiles());

        System.out.println("3.为文件时也会返回为空");
        file = new File("Java基础\\src\\Day27\\Demo271.java");
        System.out.println(file.listFiles());

        System.out.println("4.为空文件夹时返回为空数组");
        file = new File("Java基础\\src\\Day27\\MyTxt\\directory1");
        System.out.println(Arrays.toString(file.listFiles()));

        System.out.println("5.除此之外,能够获取到隐藏文件夹,有些文件夹可能权限不足无法访问,返回为空");

        System.out.println("6.列出可以用的文件系统根");
        System.out.println(Arrays.toString(File.listRoots()));

        System.out.println("7.获取目录下的文件名(String类型的)");
        file = new File("Java基础\\src\\Day27");
        System.out.println(Arrays.toString(file.list()));

        System.out.println("8.可以在创建文件时传入接口实现类过滤内容");
        file.listFiles((myFile)->myFile.getName().startsWith("D"));
    }
}


十.案例:遍历文件夹:需要注意无权限访问的文件夹,返回数组时会返回为空

public class Demo2710 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\33428\\AppData\\Local\\Microsoft");
        myForEach(file);
    }
    public static void myForEach(File file){
        if (file.isFile()){
            System.out.println(file);
            return;
        }
        File[] files = file.listFiles();
        if (files==null)return;
        for (File listFile : files) myForEach(listFile);
    }
}


十一.案例:删除多级文件夹

public class Demo2711 {
    public static void main(String[] args) {
        File file = new File("JAVA基础\\src\\Day27\\MyTxt\\directory1");
        myDelete(file);
    }
    public static void myDelete(File file){
        //当前文件可以删除(只留下有内容的文件)
        if (file.delete()){return;}
        //下面的就是文件了获取文件的数组
        File[] files = file.listFiles();
        //这里的循环在后面就不需要再删除了,进入子级目录又会在开头判断能不能删除
        for (File listFile : files) myDelete(listFile);
        //删除当前文件夹
        file.delete();
    }
}


十二.案例:统计文件夹中有后缀名的文文件的个数

//案例:统计文件夹中有后缀名的文文件的个数
public class Demo2712 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\33428\\Desktop");
        HashMap<String, Integer> hashMap = new HashMap<>();
        myForEach(file, hashMap);
        hashMap.forEach((s, integer) -> System.out.println(s+":"+integer+"个"));
    }
    public static void myForEach(File file, HashMap<String, Integer> hashMap) {
        if (file.isFile()) {
            String[] strings = file.getName().split("\\.");
            if (strings.length==0)return;
            String str = strings[strings.length - 1];//后缀名
            if (hashMap.containsKey(str)) hashMap.put(str, hashMap.get(str) + 1);
            else hashMap.put(str, 1);
            return;
        }
        File[] files = file.listFiles();
        if (files == null) return;
        for (File listFile : files) myForEach(listFile, hashMap);
    }
}


十三.案例:获取文件夹里面的文件大小,需要注意不要对文件夹使用length方法

public class Demo2713 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\33428\\Videos");
        System.out.println(myForEach(file));
    }
    public static Long myForEach(File file){
        if (file.isFile()){
            System.out.println(file);
            return file.length();
        }
        File[] files = file.listFiles();
        if (files==null)return 0L;
        long sum = 0L;
        for (File listFile : files) sum += myForEach(listFile);
        return sum;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值