2016-08-13 2 views
0

я использовал буферное писатель для записи содержимого массива в текстовый файлBufferedWriter не писать массив

try { 
    File file = new File("Details.txt"); 

    if (!file.exists()) { 
     file.createNewFile(); 
    } 

    FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    BufferedWriter bw = new BufferedWriter(fw); 


    for (String line : customer) { 
     bw.write(line); //line 178 
     bw.newLine(); 
    } 

    bw.flush(); 
    bw.close(); 

    System.out.println("Done"); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

customer[] массив следующим образом:

String customer[] = new String[10]; 
customer[1]="Anne"; 
customer[2]="Michelle"; 

Но когда я пытаюсь При написании файла я получаю следующую ошибку:

Exception in thread "main" java.lang.NullPointerException 
    at java.io.Writer.write(Unknown Source) 
    at HotelFunctions.storeData(CustomerMenu.java:178) 
    at MainClass.main(MainClass.java:38) 

Я выяснил, что ошибка вызвана тем, что customer[0] - null. Я хочу избежать нулевых элементов и писать только элементы, содержащие строковое содержимое. Есть ли способ справиться с этой ошибкой?

+0

поставить проверку внутри цикла для нулевых элементов и не писать их. название вашего вопроса вводит в заблуждение, проблема заключается не в том, что буферист не пишет. это то, что вы даете ему недопустимый аргумент. – pvg

+0

Вы должны устранить проблему при заполнении своего массива клиентов, убедившись, что в элементе, расположенном в индексе 0 вашего массива, есть допустимая строка (customer [0] = «Anne»;). – DevilsHnd

ответ

2

Пара вещей. Сначала индексы массива начинаются с нуля, а не 1. Вы должны начинать с customer[0].

customer[0] = "Anne"; 
customer[1] = "Michelle"; 

Во-вторых, вы можете проверить наличие null. Это один из способов.

for (String line: customer) { 
    if (line != null) { 
     bw.write(line); 
     bw.newLine(); 
    } 
} 

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

List<String> customers = new ArrayList<>(); 

customers.add("Anne"); 
customers.add("Michelle"); 

for (String customer: customers) { 
    bw.write(customer); 
    bw.newLine(); 
} 

(Кстати, я призываю вас использовать схему именования я сделал выше Регулярные переменные являются особыми, а массивы и списки используют множественное число:.. customers список, и каждый элемент является customer)

1

По умолчанию массив объектов (например, строк) заполняется значениями null. Таким образом, с

String customer[] = new String[10]; 
customer[1]="Anne"; 
customer[2]="Michelle"; 

Вы заканчиваете на массив, как [null, "Anne", "Michelle", null, null, ..., null].

Теперь код write методы выглядит следующим образом:

public void write(String str) throws IOException { 
    write(str, 0, str.length()); 
} 

так, когда вы передаете null (String массива по умолчанию, наполненное null с) str.length() заканчивается, как null.length(), который является недопустимым, так как null не есть какие-либо методы или поля и NPE.

Если вы хотите, чтобы пропустить null элементы, которые вы можете просто проверить их с == или != как

for (String line : customer) { 
    if (line != null){ 
     bw.write(line); 
     bw.newLine(); 
    } 
} 
Смежные вопросы