File类中createNewFile方法为什么需要抛出异常而mkdirs不需要?

问题

在学习对硬盘文件操作类File时我们会遇到如下的情况:
我们来创建一个新文件:

public class FileTest {
    public static void main(String[] args) {
        testOfCreateNewFile();//报错
    }

public static void testOfCreateNewFile(){
        File file = new File("D:\\javaspace\\study.txt");
        boolean isNewFile = false;
        isNewFile = file.createNewFile();//报错
        System.out.println(isNewFile);
    }

编译器一般会报错:Unhandled exception: java.io.IOException,意思是没有进行IO异常的处理。这里我们很奇怪?我们的代码语法上是没有错误的为什么编译不通过?我们其实忽略了方法中潜在的异常:如果路径中的javaspace目录不存在呢?或者说在多线程文件被中途删除了呢?所以系统会提示我们去处理或者抛出这个异常,我的博客里有一篇博客专门讲了如何去处理这个异常,这里我们简单的写书正确处理异常的代码即可:

  public static void testOfCreateNewFile(){
        File file = new File("D:\\javaspace_idea\\texture\\study.txt");
        boolean isNewFile = false;
        try {
            isNewFile = file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        System.out.println(isNewFile);
    }

然后我们再来看看创建目录的过程:

public class FileTest {
    public static void main(String[] args) {
       testOfMkdirs();
    }

 public static void testOfMkdirs(){
        File file = new File("D:\\a\\b\\c");
        boolean isMadirs;
        isMadirs = file.mkdirs();
        System.out.println(isMadirs);
    }

这里编译器是可以编译通过的,没有要求我们对异常进行处理,那你可能问了,如果父路径中a、b文件夹不存在的话不是类似于上述的创建文件出现的IO异常吗?这个问题是值得我们去深究的。

解释

首先我们查询一下官方的文档:
《File类中createNewFile方法为什么需要抛出异常而mkdirs不需要?》
《File类中createNewFile方法为什么需要抛出异常而mkdirs不需要?》
官方文档中的createNewFile方法中标注的需要抛出异常的,但是mkdirs是没有标注的,其实到这里我们就可以解决这个问题了,但是我们想知道它到底为什么不需要抛出异常,这里我们就需要看mkdirs方法到底是如何实现的。所以我们打开了File类中的mkdirs方法:

//File中mkdirs的实现
  public boolean mkdirs() {
        if (exists()) {
            return false;
        }
        if (mkdir()) {//【1】
            return true;
        }
        File canonFile = null;
        try {//【2】
            canonFile = getCanonicalFile();
        } catch (IOException e) {
            return false;
        }

        File parent = canonFile.getParentFile();
        return (parent != null && (parent.mkdirs() || parent.exists()) &&
                canonFile.mkdir());//【3】
    }

这里我们不去完整解释这个代码的意思,我们从三个地方来看看:首先【1】中出现了mkdir()方法,我们知道mkdir和mkdirs的区别就是s可以在父目录不存在的情况下创建父目录,而mkdir是不行的,这说明mkdirs和mkdir是有关系的。再来看【2】是一个对异常的处理,也许到这里你可以大致明白为什么mkdirs不用抛出异常了吧,因为方法内部已经对异常进行了处理。这里还选了第三个地方进行解释【3】:我们奇怪为什么mkdirs能创建父目录,其实这里出现的mkdir迭代已经说明问题,mkdirs中其实在父目录不存在的时候会进行判断,然后迭代mkdir来创建父目录,直至它存在,所以总结下来这个方法是不需要处理异常的。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/xb2355404/article/details/79198910
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞