Обнаружение основной причины для java.io.FileNotFoundException

FileNotFoundException выбрасывается во всевозможные случаи - не обязательно только при неправильном имени файла, но также и при e. г. разрешения не позволяют создавать или читать файл:

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, жалующаяся на недопустимое имя пользователя или пароль.

Есть ли способ не разбирать сообщение об исключениях, чтобы получить немного более тонкую информацию о том, почему именно произошло исключение? Проблема с разбором сообщений заключается в том, что в разных местах сообщения будут меняться.

Ответы

Ответ 1

Перед созданием 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
  ...
}

Ответ 2

Вы можете посмотреть свойства файла, используя объект java.io.File, прежде чем пытаться прочитать файл. Там может быть метод canRead, который вы можете использовать, чтобы определить, может ли пользователь читать файл.

Ответ 3

Один из подходов - посмотреть на фактический тип исключения: как вы можете видеть из docs, есть много подклассов, которые предоставляют более тонкую информацию.

Однако вы, вероятно, не уйдете с этим. Как и в большинстве проверенных исключений, обычно лучше регистрировать/сообщать об исключении и спрашивать у пользователя о том, как его исправить.