java.io.FileNotFoundException убивает поток

Ловлю java.io.FileNotFoundException: /sys/kernel/security/apparmor/.null (Отказано в доступе) под Debian. Вот код:

FileInputStream stream;
try
  {
    stream = new FileInputStream(file);
  }
catch
  {
    System.out.println(e);
  }

Причем если проверить file.exists() то файл существует. Если проверить file.canRead() то тоже все ок. Может кто сталкивался и может помочь? Ладно бы исключение обработалось и программа продолжила бы работать, но после него программа "ложится" и вставать уже не собирается почему то. Да, сообщение выводится, но потом происходит что-то странное. Этот код вертится в отдельном потоке который перебирает файлы в заданной папке и пытается их прочитать. После одного такого файла поток уходит в оффлайн, перед этим сообщив ошибку. Символические ссылки поток пропускает.

Вот весь код:

    @Override
    public void run()
      {
        super.run();
        brute(dir);
        System.out.println("find thread finished");
      }

    private void brute(File f)
      {
        if (Files.isSymbolicLink(f.toPath()))
          return;
        if (f.isDirectory())
          dir_brute(f);
        else
          file_check(f);
      }

    private void dir_brute(File f)
      {
        if (Files.isSymbolicLink(f.toPath()))
          return;
        if (f.listFiles() == null)
          return;
        for (File i : f.listFiles())
          brute(i);
      }

    private void file_check(File f)
      {
        if (Files.isSymbolicLink(f.toPath()))
          return;
        if(!Files.isReadable(f.toPath()))
          {
            System.out.println("unreadable " + canonical_path(f));
            return;
          }
        Map m = meta(f);
        if(m==null)
          {
            System.out.println("null meta " + canonical_path(f));
            return;
          }
        if (check(m, vector))
          {
            System.out.println("good " + canonical_path(f));
            for (int i = 0; i < 1; i++)
              {
                writer.print(canonical_path(f) + '\r' + '\n');
                writer.flush();
              }
          }
        else
          System.out.println(" bad " + canonical_path(f));
      }

В функции meta вот что:

        Metadata metadata = new Metadata();
        AutoDetectParser parser = new AutoDetectParser();
        BodyContentHandler handler = new BodyContentHandler();
        ParseContext context = new ParseContext();
        FileInputStream stream;
        if(!file.exists())
          return null;
        try
          {
            stream = new FileInputStream(file);
          }
        catch (java.io.FileNotFoundException e)
          {
            System.out.println(e);
            return null;
          }
        try
          {
            parser.parse(stream, handler, metadata, context);
          }
        catch (Exception e)
          {
            System.out.println(e);
            return null;
          }
        String content_type = metadata.get(Metadata.CONTENT_TYPE);
        //проверено, content_type может быть null!
        if (content_type == null)
          return null;
        else
          metadata.add("Тип содержимого", content_type);
        metadata.remove(Metadata.CONTENT_TYPE);
        metadata.add("Расширения", ext_from_repo(content_type));
        Map result = new TreeMap();
        for (String dirty_name : metadata.names())
          {
            Object name = Core.getNames().get(dirty_name);
            String values[] = metadata.getValues(dirty_name);
            if (values.length == 1)
              result.put(name == null ? dirty_name : name, values[0]);
            if (values.length > 1 && !dirty_name.equals("X-Parsed-By"))
              {
                get_main_writer().println("ALERT: more than 2 for non-parser meta field:" + dirty_name);
                get_main_writer().flush();
              }
          }
        return result;

Ответы (1 шт):

Автор решения: Alexey R.

Когда у Вас в ф-ии meta выполняется вот это

catch (java.io.FileNotFoundException e)
  {
    System.out.println(e);
    return null;
  }

Строчка return null возвращает вас обратно по стеку вызова со значением null, где затем происходит вот это:

if(m==null)
  {
    System.out.println("null meta " + canonical_path(f));
    return;
  }

Что опять же нас возвращает еще на шаг назад сюда:

private void brute(File f)
  {
    if (Files.isSymbolicLink(f.toPath()))
      return;
    if (f.isDirectory())
      dir_brute(f);
    else
      file_check(f);
  }

где file_check(f) (место, откуда мы вернулись) - последняя инструкция текущего метода brute(File f).

Соотв-но мы возвращаемся обратно в run() где всё и завершается. Вам надо переработать механизм обхода дерева файловой системы.

→ Ссылка