【问题标题】:Type of Exception in catch blockcatch 块中的异常类型
【发布时间】:2016-06-09 10:32:15
【问题描述】:

我正在学习如何使用此代码在 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");
    }
}

【问题讨论】:

  • 您的 try 块中只有一个方法调用。阅读该方法的 Javadoc,看看它可能会抛出什么。

标签: java file exception


【解决方案1】:

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

java.lang.SecurityExceptionRuntimeException 并且不需要被捕获,尽管您可能希望根据上下文(再次参见 API)。

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

请参阅here 了解有关此问题的一些 SO 文献。

【讨论】:

  • 这意味着我必须从 java API 中查看函数抛出的异常类型并相应地编写。
  • @user3747720 是的,使用 API 意味着了解它做什么或应该做什么。这通常适用于任何编程语言和任何给定的上下文。
【解决方案2】:
  • 记住哪些方法会引发异常以及它们是哪些异常。
  • 如果您认为某个方法可能引发异常,请查看文档。
  • 只需尝试编译代码并修复编译器抛出的错误(如果缺少 try-catch 块,它们会告诉您通过什么方法抛出了哪些异常)。

有问题的方法 (File.mkdir()) 会抛出一个 SecurityException,它不需要 被捕获(如果需要,你可以),因为它是一个未经检查的 RuntimeException。 p>

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

安全异常:https://docs.oracle.com/javase/7/docs/api/java/lang/SecurityException.html

【讨论】:

    【解决方案3】:

    引用JLS Section 11.2:

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

    如果您在 try 块中调用的任何方法都没有声明它 throws IOException(并且您也没有直接 throw new IOException(..)),那么如果您尝试捕获 IOException,则会出现编译时错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2012-01-16
      • 2015-08-16
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多