【问题标题】:AccessDeniedException exception in javajava中的AccessDeniedException异常
【发布时间】:2014-04-19 15:06:44
【问题描述】:

我有以下代码需要捕获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 是只读的,我会得到“file not found”而不是“Access Denied”的输出。我想了解这是什么原因?另外,上述捕获AccessDeniedException的结构是否正确?

【问题讨论】:

  • 不打印,使用e.printStackTrace()在控制台获取详细的错误信息
  • 打印完整的异常堆栈跟踪并粘贴
  • 当文件没有设置为只读时,程序能找到文件吗?

标签: java file exception exception-handling


【解决方案1】:

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
}

【讨论】:

  • 而 OP 正在使用import java.nio.file.AccessDeniedException; 有必要吗?
  • 我不太明白你的问题......是的,你需要导入异常,这是它定义的包......
【解决方案2】:

PrintWriter中有NO这样的AccessDeniedException

SecurityExceptionPrintWriter抛出的异常

如果存在安全管理器并且 checkWrite(file.getPath()) 拒绝 文件的写权限

【讨论】:

  • 很抱歉,这是错误的;旧文件 API 已损坏,如果您没有任何访问权限,抛出 FileNotFoundException...
  • @fge 请提供一些文档。我不知道。这对我也有帮助。
  • 嗯,不幸的是,这从未被正确记录。除了 AccessDeniedException 在 Java 6 中 存在,出于兼容性原因,他们无法更改抛出的异常
  • @fge 没那么简单。你们都对了一半。如果您在安全管理器下运行并且您的 .policy 文件不允许访问该文件,则会引发 SecurityException。如果 操作系统 不允许访问文件,则会引发 FileNotFoundException。
  • @AJ - 接受您的回答,现在我知道 PrintWriter 不会抛出 AccessDeniedException。但是,当客户端尝试写入存在于指定路径但具有只读访问权限的文件时,将捕获 FileNotFoundException。
猜你喜欢
  • 2016-05-18
  • 2014-12-14
  • 2012-08-13
  • 2016-01-08
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多