【问题标题】:Detect underlying cause for java.io.FileNotFoundException检测 java.io.FileNotFoundException 的根本原因
【发布时间】:2010-12-12 06:36:03
【问题描述】:

FileNotFoundException 在各种情况下都会抛出 - 不一定只在文件名无效时,而且在 e. G。权限不允许创建或读取文件:

java.io.FileNotFoundException: \\server\share\directory\test.csv (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
    at java.io.FileWriter.<init>(FileWriter.java:73)

上面的示例显示了一个德国 Windows 抱怨用户名或密码无效。

有没有办法解析异常消息以获取关于为什么异常发生的更细粒度的信息?消息解析的问题在于,在不同的语言环境中,消息会有所不同。

【问题讨论】:

    标签: java localization file-permissions filenotfoundexception


    【解决方案1】:

    一种方法是查看异常的实际类型:从docs 中可以看到,有很多子类提供了更细粒度的信息。

    但是,您可能不会走得太远。与大多数已检查的异常一样,通常最好记录/报告异常并询问用户如何更正它。

    【讨论】:

    • 问题是我得到一个 FileNotFoundException,而不是一个通用的 IOException。我想提供比“找不到文件”或“通用错误”更好的用户消息,将用户指向权限问题...
    • 我的错误 - 我读到了 IOException。不幸的是,Java 异常很少有额外的信息(例如 POSIX 错误代码),并且在许多情况下被延伸以涵盖与其名称关系不大的条件(有时是由于将 POSIX 代码分配给异常类型,有时,我认为,由于懒惰)。
    【解决方案2】:

    在尝试读取文件之前,您可能希望使用java.io.File 对象查看文件的属性。有一个 canRead 方法,您可以使用它来确定用户是否可以读取文件。

    【讨论】:

      【解决方案3】:

      在创建FileOutputStream之前自己检查文件是否存在/读写权限。

      File test_csv = new File( "\\server\share\directory\test.csv" );
      
      if ( test_csv.exists( ) && test_csv.canWrite( ) )
      {
        // Create file writer
        ...
      }
      else
      {
        // notify user
        ...
      }
      

      请注意,如果您需要创建新文件,有时您必须检查目标文件父级的读/写权限。

      File test_csv = new File( "\\server\share\directory\test.csv" );
      File parent_dir = test_csv.getParentFile( )
      
      if ( parent_dir.exists( ) && parent_dir.canWrite( ) )
      {
        // Create file writer
        ...
      }
      else
      {
        // notify user
        ...
      }
      

      【讨论】:

      • 哦!有时生活可以如此简单。感谢您让我看到显而易见的事实。
      • 小心。显然有一些错误会影响这些方法的返回结果。如果您的目录是自定义目录或系统目录,或者位于某些类型的网络共享上,您可能会得到无效的结果。
      • 显然我刚刚被bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819 知道了,它会告诉您Windows 上的用户主目录(文档和设置...)是不可写的。解决方法:尝试在父文件夹中创建一个临时文件,然后在成功后立即将其删除。如果抛出 IOException,你真的不能写。
      • 如果我从 Intellij 以管理员身份运行,是否可能出现权限问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多