catch块中的异常类型

时间:2016-06-09 10:32:15

标签: java file exception

我正在学习如何使用此代码在java中创建文件和目录。 在ERROR LINE我收到错误,因为“此块中永远不会抛出IOException” 那么我怎么知道哪个函数抛出什么类型的异常? 或者如果我不确定我应该在每个catch块中使用泛型Exception

public class FileTest {
    public static void main(String[] args) {
        //file creation
        boolean flag = false;
        File file = new File("/IdeaProjects/JavaCode/jstest.txt");
        try {
            flag  = file.createNewFile();
        }catch (IOException e){
            e.printStackTrace();
        }
        System.out.println("file path is : "  + file.getPath());

        //dir creation
        boolean dirFlag = false;
        File fileDir  = new File("/IdeaProjects/JavaCode/js");
        try{
            dirFlag = fileDir.mkdir();
        }catch (IOException e){//ERROR LINE
            e.printStackTrace();
        }
        if(dirFlag)
            System.out.println("created");
        else
            System.out.println("exist");
    }
}

3 个答案:

答案 0 :(得分:1)

java.io.File#mkdir方法仅声明抛出SecurityException - 请参阅API

java.lang.SecurityExceptionRuntimeException并且不需要被捕获,但您可能需要,具体取决于上下文(再次参见API)。

在每个java.lang.Exception区块中捕获一般catch绝对不是推荐的做法,尽管有时可能需要(但不是在您目前的情况下)。

有关此事的一些SO文献,请参阅here

答案 1 :(得分:0)

  • 记住哪些方法会抛出异常以及它们是哪些异常。
  • 如果您认为方法可能会引发异常,请查看文档。
  • 只是尝试编译代码并修复编译器抛出的错误(如果缺少try-catch块,它们会告诉你什么方法抛出了什么异常)。

有问题的方法(File.mkdir())会抛出SecurityException,但需要被捕获(如果需要,可以),因为它是未经检查的{{ 1}}。

java.io.File:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdir()

SecurityException:https://docs.oracle.com/javase/7/docs/api/java/lang/SecurityException.html

答案 2 :(得分:0)

引用JLS Section 11.2

  

如果catch子句可以捕获已检查的异常类E1并且不是对应于catch子句的try块可以抛出作为E1的子类或超类的已检查异常类,则是编译时错误,除非E1是Exception或Exception的超类。

如果你在try块中调用的方法没有声明它throws IOException(并且你也不直接throw new IOException(..)),那么如果你试图捕获一个,那么这是一个编译时错误IOException