@miu4_14

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

csvファイルからデータを読み込みたい

Q&A

Closed

解決したいこと

csvファイルから6人分のデータを読み込み、readDataクラスのフィールドに代入してから、readDataBookクラスでreadData型配列に格納したい。
エラーメッセージ的には、2人目のデータを格納する際にStringがnullであると言っていると思うので、原因を知りたいです。

発生している問題・エラー

masaki,86,75,94,73,83
masaki
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "readData.readData.setReadDataName(String)" because "<parameter1>[<local5>]" is null
    at readAndWrite.read(readAndWrite.java:18)
    at Main.main(Main.java:9)

該当するソースコード

import readData.*;

public class Main {
  public static void main(String[] args) {
    readData[] rd = new readData[6];
    readDataBook rdbook = new readDataBook();
    readAndWrite rad = new readAndWrite();
    //data.csvからデータを読み込む
    rad.read(rd, rdbook);

    //何人分のデータが格納されているかの取得
    int num = rdbook.getNum();

    //out.txtに書き込み
    rad.write(num, rdbook);
  }
}

import java.io.*;
import java.util.*;
import java.nio.file.*;
import readData.*;

public class readAndWrite {
  public void read(readData[] rd, readDataBook rdbook) {
    try(FileReader fr = new FileReader("data.csv")) {
      BufferedReader reader = new BufferedReader(fr);
      int i = 0;
      String line;
      String[] data;
      line = reader.readLine();
      while (line != null) {
      System.out.println(line);
      data = line.split(",");
      rd[i].setReadDataName(data[0]);
      rd[i].setReadDataJapanese(data[1]);
      rd[i].setReadDataMath(data[2]);
      rd[i].setReadDataEnglish(data[3]);
      rd[i].setReadDataScience(data[4]);
      rd[i].setReadDataSocial(data[5]);
      rdbook.addReadDataBook(rd[i]);
      line = reader.readLine();
      i++;
      }
      }catch(FileNotFoundException e) {
      System.out.println("File not found");
      }catch(IOException e) {
      System.out.println(e);
      }
  }

  public void write(int num, readDataBook book) {
    try (PrintWriter w = new PrintWriter(
      new BufferedWriter(
      new FileWriter("out.txt")))) {
        //各教科の平均点を書き出す
          w.println(book.japaneseAverage());
          w.println(book.mathAverage());
          w.println(book.englishAverage());
          w.println(book.scienceAverage());
          w.println(book.socialAverage());

        //5教科平均点を書き出す
          w.println(book.fiveAverage());

        //5教科合計の1位を書き出す
          w.println("1位 " + book.fiveWinPerson() + " " + book.fiveWinScore());


      } catch(IOException e) {
      System.out.println(e);
    }
  }

}

package readData;

public class readData {

  public String name;
  public int japanese;
  public int math;
  public int english;
  public int science;
  public int social;

  public void setReadDataName(String n) {
    this.name = n;
  }

  public void setReadDataJapanese(String j) {
    this.japanese = Integer.parseInt(j);
  }

  public void setReadDataMath(String m) {
    this.math = Integer.parseInt(m);
  }

  public void setReadDataEnglish(String e) {
    this.english = Integer.parseInt(e);
  }

  public void setReadDataScience(String sc) {
    this.science = Integer.parseInt(sc);
  }

  public void setReadDataSocial(String so) {
    this.social = Integer.parseInt(so);
  }

  public String getName() {
    return this.name;
  }

  public int getJapanese() {
    return this.japanese;
  }

  public int getMath() {
    return this.math;
  }

  public int getEnglish() {
    return this.english;
  }

  public int getScience() {
    return this.science;
  }

  public int getSocial() {
    return this.social;
  }

  public int getSum() {
    int sum;
    sum = this.japanese + this.math + this.english + this.science + this.social;
    return sum;
  }

  public double getAverage() {
    int sum;
    double ave;
    sum = this.getSum();
    ave = (double)sum / 5;
    return ave;
  }
}

package readData;

public class readDataBook {
  readData[] list = new readData[10];
  int num = 0;

  //読み込んだデータを配列に格納する
  public void addReadDataBook(readData r) {
    list[num] = r;
    System.out.println(num + " " + list[num].getJapanese());
    num++;
  }
  //何人分のデータが格納されているかを返す
  public int getNum() {
    return this.num;
  }

  //各教科の平均点を返す
  public double japaneseAverage() {
    int sum = 0;
    double ave;
    for(int i=0; i<num; i++) {
      sum += list[i].getJapanese();
      System.out.println(i + " " + list[i].getJapanese());
    }
    return ave = sum / num;
  }

  public double mathAverage() {
    int sum = 0;
    double ave;
    for(int i=0; i<num; i++) {
      sum += list[i].getMath();
    }
    return ave = sum / num;
  }

  public double englishAverage() {
    int sum = 0;
    double ave;
    for(int i=0; i<num; i++) {
      sum += list[i].getEnglish();
    }
    return ave = sum / num;
  }

  public double scienceAverage() {
    int sum = 0;
    double ave;
    for(int i=0; i<num; i++) {
      sum += list[i].getScience();
    }
    return ave = sum / num;
  }

  public double socialAverage() {
    int sum = 0;
    double ave;
    for(int i=0; i<num; i++) {
      sum += list[i].getSocial();
    }
    return ave = sum / num;
  }

  //5教科の平均点を返す
  public double fiveAverage() {
    int sum = 0;
    double fiveave;
    for(int i=0; i<num; i++) {
      sum += list[i].getSum();
    }
    fiveave = (double)sum / num;
    return fiveave;
  }

  //5教科の1位の人を返す
  public String fiveWinPerson() {
    int winner = 0, rt = 0;
    for(int i=0; i<num; i++) {
      if(winner < list[i].getSum()) {
        winner = list[i].getSum();
        rt = i;
      }
    }
    return list[rt].name;
  }

  //5教科の1位の得点を返す
  public int fiveWinScore() {
    int winner = 0, rt = 0;
    for(int i=0; i<num; i++) {
      if(winner < list[i].getSum()) {
        winner = list[i].getSum();
        rt = i;
      }
    }
    return list[rt].getSum();
  }

}

自分で試したこと

初めはreadData型インスタンスを1つでコードを書いていたが、readData[]配列に変更した。

0 likes

1Answer

記事によると、

オブジェクトを入れるための配列を宣言しただけであり、配列の各要素にnewされたオブジェクトが
格納されてはいないことが分かりました。
それで、空となっている配列の中身にアクセスして、Null Pointer Exceptionが発生していました。

なので、MainクラスのreadData型配列の宣言部分において (5行目あたり)

readData[] rd = new readData[6]; //配列宣言
for(int i;i<rd.length;i++){      //配列の各要素にオブジェクトを生成
  rd[i] = new readData();
}

で如何でしょうか...!

0Like

Your answer might help someone💌