2013-03-16 2 views
0

У меня есть 2d-массив, который записывается в файл с помощью другого метода. Я определил содержимое массива 2d в методе наблюдений, но когда он переходит к методу сохранения, содержимое (по крайней мере, в блоке [1] [1]) становится нулевым. Как я могу убедиться, что значение остается определенным? Мой код до сих пор:Исправление ошибки nullpointerexception в Java

(визирования Метод)

public void Sighting() 
{ 
    Scanner input = new Scanner (System.in); 
    String MigChoice; //initiates Migrant Choice variable to be stored 
    String Trail; //initiates Trail to be stored 
    String NumberSeen; //initiates number to be stored 
    String Species; //initiates species to be stored 
    String Date; //initiates date to be stored 
    String[][] EntryList; 
    EntryList = new String [500][5]; 
    System.out.print("What species of bird was observed?\n"); 
    Species = input.nextLine(); 
    System.out.print("What trail did this spotting take place on?\nDirectory:\n"); 
    System.out.println("1). Alligator Alley"); 
    System.out.println("2). Eagle Roost"); 
    System.out.println("3). Heron Hideout"); 
    System.out.println("4). Lost Bridge Trail"); 
    System.out.println("5). Marsh Rabbit Run"); 
    System.out.println("6). Otter"); 
    System.out.println("7). Shady Oak"); 
    System.out.println("8). Wading Bird Way"); 
    System.out.println("9). Windmill Whisper"); 
    Trail = input.nextLine(); 
    System.out.println("The species is:\n1.)Migrant\n2.)Residential"); 
    System.out.print("Please enter Migrant or Residential: "); 
    MigChoice = input.next(); 
    System.out.print("What was the time of this sighting (in mm/dd/yyyy format)?\n"); 
    Date = input.next(); 
    System.out.print("Finally, how many birds were observed?\n"); 
    NumberSeen = input.next(); 
    EntryList [0][0] = Species; 
    EntryList [0][1] = Trail; 
    EntryList [0][2] = MigChoice; 
    EntryList [0][3] = Date; 
    EntryList [0][4] = NumberSeen; 
    Save(EntryList); 
    System.out.print("Thank you for adding an entry!"); 
    System.out.println("Returning to main menu"); 
    Menu(); 
} 

(Сохранить метод)

public void Save(String[][] EntryList) { 
    try { 
     String[][] content = EntryList; 
     File file = new File("CBB.dat"); 

     // if file doesnt exists, then create it 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 
     if (EntryList[0][0] != null) { 
      DataInputStream instream; 
      DataOutputStream outstream; 
      instream = new DataInputStream(new BufferedInputStream(
        new FileInputStream(file))); // buffers the data stream 
      outstream = new DataOutputStream(new BufferedOutputStream(
        new FileOutputStream(file))); 
      FileWriter fw = new FileWriter("CBB.dat", true); 
      BufferedWriter writer = new BufferedWriter(fw); 
      for (int row = 0; row < EntryList.length; row++) { 
       outstream.writeUTF(EntryList[row][0]); 

       outstream.writeUTF(EntryList[row][1]); 

       outstream.writeUTF(EntryList[row][2]); 

       outstream.writeUTF(EntryList[row][3]); 

       outstream.writeUTF(EntryList[row][4]); 
      } 
      outstream.close(); 
     } else 
      System.out.print("Something is wrong"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Сообщение об ошибке:

java.lang.NullPointerException 
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:330) 
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:306) 
at Dossier.Save(Dossier.java:158) 
at Dossier.Sighting(Dossier.java:133) 
+0

Вы только установить 'EntryList [0] [0],' EntryList [0] [1], 'EntryList [0 ] [2] ',' EntryList [0] [3] 'и' EntryList [0] [4] ', поэтому' EntryList [1] [1] 'будет null –

+0

Спасибо за разъяснение этой ошибки, но ошибка все еще происходит, когда я установил if (EntryList [1] [1]! = null) в if (EntryList [0] [0]! = null). Будет оценено более глубокое понимание. – LP7665

+0

Можете ли вы разместить сообщение об ошибке и stacktrace в своем вопросе? –

ответ

1

writeUTF будет бросать NullPointerException если вы передать нулевой объект в качестве параметра.

записывает два байта информации длины в выходной поток, а затем с помощью модифицированного UTF-8 представления каждого символа в строке с. Если s равно null, генерируется исключение NullPointerException. Каждый символ в строка s преобразуется в группу из одного, двух или трех байтов, в зависимости от значения символа.

Вы можете добавить нулевой чек, если ваш цикл:

for (int row = 0; row < EntryList.length; row++) 
    { 
      for(int col = 0; col < EntryList[row].length;col++) { 
       if(EntryList[row][col] != null) 
        outstream.writeUTF(EntryList[row][col]); 
      } 
    } 
+1

Почему 5 условие, когда вы можете сделать другое и исправить его только одним? – Sam

+0

Это определенно помогает. Еще одна вещь, программа, похоже, не добавляет текстовый файл, хотя у меня есть строка FileWriter fw = new FileWriter («CBB.dat», true) ;. Знаете ли вы, почему это так? – LP7665

+0

@Sam: Да, я просто сделал это проще ... Спасибо! –

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