Нулевой указатель при перемещении данных

Сделайте это для скрытых файлов:

File root = new File(yourDirectory);
File[] files = root.listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return !file.isHidden();
    }
});

Это не приведет к возврату скрытых файлов.

Что касается системных файлов, я считаю, что это концепция Windows и, следовательно, может не поддерживаться интерфейсом File, который пытается быть независимым от системы. Однако вы можете использовать команды командной строки, если они существуют.

Или используйте то, что @Reimeus имел в своем ответе.

Возможно, как

    File root = new File("C:\\");

    File[] files = root.listFiles(new FileFilter() {
        @Override
        public boolean accept(File file) {
            Path path = Paths.get(file.getAbsolutePath());
            DosFileAttributes dfa;
            try {
                dfa = Files.readAttributes(path, DosFileAttributes.class);
            } catch (IOException e) {
                // bad practice
                return false;
            }
            return (!dfa.isHidden() && !dfa.isSystem());
        }
    });

DosFileAttributes был введен в Java 7.

1
задан matt b 17 August 2010 в 11:37
поделиться

6 ответов

Ссылка на массив пуста, скорее всего, потому что в rMap не было добавлено значение (или null ) с ключом 0 .

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

1
ответ дан 2 September 2019 в 22:07
поделиться

Как вы заполняете карту? Вы уверены, что помещаете в него ненулевую запись с ключом Integer , равным 0?

Что ж, мы можем быть уверены, что это не так. Возможные причины:

  • Ошибка в коде заполнения, из-за которой предполагаемая операция размещения не выполняется, или с другим значением ключа
  • Вы используете Short или Byte объекты как ключи
  • Вы помещаете значение null в карту под ключом 0

. Вы можете ответить на этот вопрос сами, запустив код в отладчике и глядя на содержимое карты.

Обновление:

Значение My Key - String

Что ж, вот и ваша проблема. rMap.get (0) будет искать целое число и не будет соответствовать записи для строки «0» .

1
ответ дан 2 September 2019 в 22:07
поделиться

HashMap допускает нулевые значения, поэтому значение, которое вы получаете с помощью String array [] = rMap.get (0); , может быть нулевым. При доступе к нулевому массиву возникает NPE.

0
ответ дан 2 September 2019 в 22:07
поделиться

Попробуйте rMap.get ( Integer.valueOf (0));

0
ответ дан 2 September 2019 в 22:07
поделиться

Это проблема, когда вы вызываете метод get реализации Map, сигнатура метода get java.util.Map - get (java.lang.Object), поэтому любой объект будет принят в качестве его аргумента.

Ключ, который работает нормально, - это либо передать строку (значение = 0) в качестве ключа, либо переопределить hashCode и равные методы объекта аргумента, который не является объектом java.lang.String.

0
ответ дан 2 September 2019 в 22:07
поделиться

Метод get () в Hashmap принимает ключ, а не индекс, чтобы идентифицировать значение, которое вы хотите получить. Если вам нужен упорядоченный список элементов, вам нужно будет использовать подкласс List (или принудительно упорядочить, вы сами). Если вы хотите использовать Hashmap, используйте метод keys (), чтобы получить перечисление всех ключей карты.

(удален над текстом в связи с прояснением вопроса. Оставив текст ниже, хотя это не проблема, но это важное соображение)

Кроме того, вам нужно быть очень осторожным, чтобы не создавать условий гонки, так как вы работаете по потокам. Хотя собственная Hashtable Java синхронизирована, это не означает, что данные в ней синхронизированы. То есть вы можете MyObj obj = get (xxx) в одном htread, Nd начать манипулировать obj в двух отдельных потоках, возможно, наступая друг на друга. В зависимости от вашего приложения вы можете использовать Hashtable.remove (), чтобы данные исчезли с карты и не могли быть использованы повторно, или вам могут понадобиться некоторые синхронизированные блоки (remove () вполне может быть более простой реализацией, thoguh вам нужно будет аккуратно обработать условия, когда на карте сначала есть данные, а затем эти данные исчезают).

0
ответ дан 2 September 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: