|
|
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Подскажите, почему я получаю NullPointerException? Пытаюсь рекурсивно вывести пути всех директорий. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:42:15 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
В какой строке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:45:32 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ какой строке? на форе вываливается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:46:33 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
listFiles() вернул null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:51:53 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
А отладчика у вас нет под рукой? В блокноте пишете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:53:49 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczlistFiles() вернул null? Насколько я понимаю, да. Вот вывод компилятора Exception in thread "main" java.lang.NullPointerException at Main.listDirs(Main.java:48) at Main.listDirs(Main.java:51) at Main.main(Main.java:36) 48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); 36 - вызов метода listDirs. Ошибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:56:34 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА отладчика у вас нет под рукой? В блокноте пишете? Есть, но это ничего не дало. Падает на разных директориях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 13:57:52 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaЕсть, но это ничего не дало. А что вы сделали чтобы оно не дало? Я бы сделал, для начала, локальные переменные, чтобы было проще отлаживать. Посмотрел что именно вываливается в null. sharmankaПадает на разных директориях. Например? Кстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:04:03 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka, может дириктория не содержит ничего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:04:32 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); 36 - вызов метода listDirs. Что-то не очень совпадает с приведенным кодом. sharmankaОшибка не сразу выскакивает, а спустя какое-то время отработки, если это важно. С чем связано - не пойму. А ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError. А ещё файловые системы позволяют создавать рекурсивные каталоги. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:07:17 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНапример? Грубо говоря, при одном запуске может упасть в папке D:\one\two, а при другом в D:\three\four\five BlazkowiczКстати, а зачем в каждой итерации гонять File в String и обратно? Ведь можно всё сделать исключительно на File, без использования String. Ваша правда, переделал. am_sasaможет дириктория не содержит ничего? тогда бы падало на первой пустой директории BlazkowiczЧто-то не очень совпадает с приведенным кодом. каким образом не совпадает? BlazkowiczА ещё в продакшн системах обычно отказываются от использования рекурсии. Потому файловая система позволяет создать дерево достаточно глубокое, чтобы выхватить StackOverflowError. А ещё файловые системы позволяют создавать рекурсивные каталоги. :) тогда подскажите мне как лучше обойти все директории на диске? С джавой работаю недавно, тонкостей не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:26:52 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:29:55 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
кстати, да. Падает на paths.listFiles() В доках фижу следующее авторReturns * {@code null} if this abstract pathname does not denote a * directory, or if an I/O error occurs. это меня ставит немного в тупик, с чего бы I/O эксепшен может возникнуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:30:17 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Какая версия Java? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:31:15 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsharmanka48 строка это цикл, 51 - listDirs(dirs.getCanonicalPath()); Код: java 1. 2. 3. 4. 5. Забыл что удалил строку :( На listDirs(dirs.getCanonicalPath()); указывало. А вообще, я сейчас вот так переписал: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Работает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах BlazkowiczКакая версия Java? 1.7.0_21 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:36:53 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaРаботает, но проверка на нулл меня не радует. Хотелось бы разобраться в причинах Странно в Java 7 обещали что будет исключени выкидывать вместо null. sharmanka1.7.0_21 Может на NIO переписать? http://stackoverflow.com/questions/10523585/how-to-read-files-recursively-in-java-7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:41:54 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
А можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:45:07 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Антивирусы установлены? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:45:30 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:51:47 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМожет на NIO переписать? Попробую. BlazkowiczА можно пример директорий для которых null выводиться? Они сильно глубокие? Они точно не системные? Есть и глубокие, есть и системные. Пару примеров D:\android\sdk\tools\templates\projects\NewJavaLibrary\root\src\library_package D:\Dropbox\.dropbox.cache D:\Сейм_2013 D:\$RECYCLE.BIN\S-1-5-21-3348034925-730243719-2734347485-1000\$RGMLHBD.5\docs\apidocs\net\sourceforge\pmd\lang\java D:\Games\Crysis2\gamecrysis2\Levels\Prism\Minimap BlazkowiczАнтивирусы установлены? др. Веб Кстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 14:51:49 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaдр. Веб А если отключить? sharmankaКстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать? Заменть хранение родительских File на Java стэке, на хранение его в коллекции. https://www.google.com/search?q=разворачивание рекурсии в цикл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:04:58 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА если отключить? Тогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря BlazkowiczЗаменть хранение родительских File на Java стэке, на хранение его в коллекции. https://www.google.com/search?q=разворачивание рекурсии в цикл А не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:46:11 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
sharmankaТогда эксепшен на одной и той же директории, на которую нет прав чтения. Вот уж не подумал бы, что это проделки антивиря Рандомные IO ошибки. Кого же ещё винить? sharmankaА не будет проблем, если каталогов больше чем размер int? Ведь доступ идет по индексу, который имеет тип int. Будет проблема если у вас вложеность каталогов превысит int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:51:02 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
BlazkowiczБудет проблема если у вас вложеность каталогов превысит int. Я сделал так: 1. Создал список с одним начальным элементом (корень диска) и с дженерик типом File 2. Аналогично коду выше получаю listFiles и проверяю по очереди, являются ли элементы директориями 3. Если да, добавляю в конец списка 4. Перехожу к следующему элементу списка Имелась ввиду другая логика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 15:58:24 |
|
||
|
Рекурсивный вывод директорий
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsharmankaдр. Веб А если отключить? sharmankaКстати, если рекурсивно обходить директории это плохо, то как надо в таком случае поступать? Заменть хранение родительских File на Java стэке, на хранение его в коллекции. https://www.google.com/search?q=разворачивание рекурсии в цикл Собственно применение рекурсии вообще не является атипаттерном. Она (рекурсия) де-факто присутствует во многих библиотеках XML-парсеров, regexps e.t.c. Просто в данном конкретном случае можно в listDirs добавить счётчик уровня (level) и ограничить рекурсию. Для listFiles конечно проверять на not-null. По поводу сим-линков и хард-линков с "петлями". Я на такие злостные случаи не нарывался но думаю что FileAPI позволит нам узнать что это за нода. Счастливые обладатели Java7 радостно танцуют http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#isSymbolicLink(java.nio.file.Path) Несчастливые обладатели тухлых версий смотрят в stackoverflow. Там был workaround для этого случая. И я-бы предложил некий буфер для (жуть медленного ) поиска повторений в путях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2013, 16:05:26 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38454418&tid=2128261]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
173ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 440ms |

| 0 / 0 |
