Исключение AccessDeniedException в java
у меня есть следующий код, где мне нужно поймать 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.2fn", 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");
    }
  }
}
В случае образец.txt только для чтения, я получаю вывод как"не нашел" вместо "доступ к denided". Я хотел бы понять, в чем причина этого? Кроме того, выше структура для ловли AccessDeniedException правильно?
2 ответов
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, что вызвано ошибками уровня файловой системы и" реальными " ошибками ввода-вывода, которые вы не можете сделать со старым API:
try {
    // some new file API operation
} catch (FileSystemException e) {
    // deal with fs error
} catch (IOException e) {
    // deal with I/O error
}
здесь нет такие AccessDeniedException на PrintWriter.
SecurityException является исключением, вызванным PrintWriter 
если менеджер безопасности присутствует и checkWrite (файл.getPath()) отрицает запись доступа к файлу
