csvファイルからデータを読み込みたい
解決したいこと
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