2015-02-07 2 views
0

У меня, похоже, проблема с неправильным синтаксисом моего кода, но, как я только начинал с изучения, похоже, что я пропущу ошибку. Это домашнее задание, где мне нужно использовать массив объектов JxploreFile. Это часть кода у меня возникают проблемы с:Добавление объектов файла в массив

private JxploreFile[] getSubFolders() 
{ 
    File subFiles[]; 
    subFiles = file.listFiles(); 

    File subFolders[]; 
    int p = 0; 
    for(int i = 0; i < subFiles.length; i++) 
    { 
     if(subFiles[i].isDirectory() == true) 
     { 
      Array.set(subFolders, p, subFiles[i]); 
     } 
    } 

    JxploreFile foldersToReturn[] = new JxploreFile[subFolders.length]; 
    for(int i=0; i < subFolders.length; i++) 
    { 
     foldersToReturn[i] = new JxploreFile(subFolders[i]); 
    } 
    return foldersToReturn; 
} 

В частности, для цикла, где я пытаюсь добавить файлы, помеченные как .isDirectory в новый массив. Я также пробовал другие методы, помещая каждый новый файл из массива subFiles вручную в массив подпапок, объявляя indexnumbers, но это также оказалось ошибочным. На данный момент у меня нет идей, и я надеюсь, что есть кто-то, кто может указать мне на очевидное, так как я, вероятно, пропустил что-то очень важное.

Редактировать: Прошу прощения за неполный пост. Это первый раз, когда я нахожусь здесь, поскольку обычно стараюсь отфильтровывать свои собственные проблемы из сообщений других. Ошибка, которую я получил, действительно заключалась в том, что «subFolders» еще не были инициализированы, чего я не понял, потому что на шестой строке я написал File subFolders []; , который, насколько мне известно, должен объявлять переменные подпапки, чтобы стать массивом, или это где я ошибся? Кроме того, мой вопрос, возможно, не был достаточно конкретным, я искал причину ошибки (о которой я вообще не упоминал): почему «subFiles» не был инициализирован.

+0

Итак, что вас беспокоит в коде? –

+0

«Проблема» слишком общая. Какие ошибки вы получаете? Добавьте их к своему вопросу. Что вы ожидаете, и что вы получите вместо этого? – RealSkeptic

+1

'subFolders' не был инициализирован. – wassgren

ответ

1

Массив subFolders не был инициализирован должным образом. Чтобы использовать массив в методе Array.set, он должен быть инициализирован и выделен с размером.

Альтернативный подход для этого заключается в использовании List. Списки хороши, когда вы работаете с более динамичными данными, например. когда вы не знаете размер массива. После этого вы можете упростить код так:

File[] subFiles = file.listFiles(); 

// Create the list 
List<JxploreFile> subFolders = new ArrayList<>(); 

// Add all the sub folders (note that "file" is a bit magic since it 
// is not specified anywhere in the original post 
for (File subFile : file.listFiles()) { 
    if (subFile.isDirectory()) { 
     subFolders.add(new JxploreFile(subFile)); 
    } 
} 

// Return an array 
return subFolders.toArray(new JxploreFile[subFolders.size()]); 

Вы также можете упростить все дело еще дальше, используя поток Java 8, как это:

return Arrays.stream(file.listFiles()) 
      .filter(File::isDirectory) 
      .toArray(JxploreFile[]::new); 

Для получения дополнительной информации:

+0

не могли бы вы объяснить мне, почему массив подпапок Array не инициализирован должным образом, потому что я сделал intitialize его на шестой строке, не так ли? – Ciphra

+0

@Ciphra, вы объявили его 'File subFolders [];' но не инициализировали его значением. Проверьте ссылку в ответе на разницу между инициализацией и объявлением [Создание объектов в Java] (http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html). – wassgren

+0

Я понимаю, что вы сейчас имеете в виду, то, что я пытаюсь сделать здесь, принципиально невозможно в текущей структуре, потому что для этого требуется определить длину массива, который я не знаю, пока не заполнил его. Вот почему вы показали это с использованием списков. Спасибо за терпение в ответе, я немного замедлился с этими вещами, я полагаю. – Ciphra

1

Там нет сомнений в вашем посте, но в любом случае здесь проблемы я нашел в своем коде:

File subFolders[]; 
int p = 0; 
for(int i = 0; i < subFiles.length; i++) 
{ 
    if(subFiles[i].isDirectory() == true) 
    { 
     Array.set(subFolders, p, subFiles[i]); 
    } 
} 

при вызове Array.set вы никогда не инициализируется subFolders, который бросит NullPointerException.

Кроме того, вам не нужно делать

if(subFiles[i].isDirectory() == true) 

вы можете просто сделать

if(subFiles[i].isDirectory()) 

, как subFiles[i].isDirectory() уже условие.

Смежные вопросы