java中的AccessDeniedException异常

时间:2014-03-14 10:55:53

标签: java file exception exception-handling

我有以下代码需要捕获AccessDeniedException异常

import java.io.PrintWriter;
import java.io.IOException;
import java.nio.file.AccessDeniedException;

class MyFileClass {
  public void write()
    throws IOException
  {
    PrintWriter out = new PrintWriter("sample.txt");

    out.printf("%8.2f\n", 3.4);

    out.close();

  }
}

public class MyClass {
  public static void main(String[] args)
    throws Exception
  {
    try {
      MyFileClass mf = new MyFileClass();
      mf.write();
    } catch (AccessDeniedException e) {
      print("Access denided");
    }
    catch (FileNotFoundException e) {
      print("File not found");
    }
  }
}

如果 sample.txt 是只读的,我会输出" 找不到文件"而#34; 访问权限"。我想了解这是什么原因?此外,上述用于捕捉AccessDeniedException的结构是否正确?

2 个答案:

答案 0 :(得分:7)

AccessDeniedException仅由新文件API抛出;旧文件API(您使用此PrintWriter构造函数)只知道如何抛出FileNotFoundException,即使真正的文件系统级问题不是"该文件不存在"。

您必须使用新API打开目标文件的输出流; 然后你可以有有意义的例外:

// _will_ throw AccessDeniedException on access problems
final OutputStream out = Files.newOutputStream(Paths.get(filename));
final PrintWriter writer = new PrintWriter(out);

更一般地说,新文件API定义FileSystemException(继承IOException),新API定义的所有新的有意义的异常都会继承。

这意味着您可以在catch子句中明确区分由文件系统级错误和"真实"引起的错误。 I / O错误,您可以使用旧API:

try {
    // some new file API operation
} catch (FileSystemException e) {
    // deal with fs error
} catch (IOException e) {
    // deal with I/O error
}

答案 1 :(得分:1)

AccessDeniedException中有这样的PrintWriter

SecurityExceptionPrintWriter

引发的例外情况
  

如果存在安全管理器且checkWrite(file.getPath())拒绝   写访问文件