오늘도 어김없이 자바 코딩 문제를 풀다가 오류에 직면했다.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "prob02.Goods.setGoods(String, int, int)" because "goods[i]" is null at prob02.GoodsApp.main(GoodsApp.java:23)
객체 배열을 생성하고 각각의 객체에 필드값을 지정하려다가 발생한 오류다.
public void setGoods(String name, int price, int count) {
setName(name);
setPrice(price);
setCount(count);
}
이러한 메소드를 만들어서 goods[i]에 name,price, count를 한번에 set하려했다.
Goods[] goods = new Goods[3];
위 코드를 통해 3개의 객체를 만들었으니 goods[i]를 통해 그 객체에 접근할 수 있을 거라고 생각하고 접근하려했다.
하지만 위와 같은 오류에 직면했고 그 이유를 찾아보니
위 코드는 Goods 라는 객체 3개를 만들었을 뿐이고 goods[i]라는 배열의 요소에는 그 객체에 접근하는 레퍼런스값이 아직 저장되지 않았던 것이다.
따라서,
goods[i] = new Goods();
이러한 코드가 따로 필요했다.
바로 위의 코드를 수행해야 각각 3개의 Goods 객체에 goods[0], goods[1], goods[2] 이 연결되는 것이다.
즉, goods[0], goods[1], goods[2]에 각 객체의 레퍼런스값(참조값)이 저장되는것!
객체란.. 어렵다..
goodsApp(main) 클래스
public class GoodsApp {
private static final int COUNT_GOODS = 3;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Goods[] goods = new Goods[COUNT_GOODS];
// 객체 배열 생성 -> 3개의 객체와 goods라는 배열이 따로 만들어짐
for(int i = 0; i < COUNT_GOODS; i++) {
String line = scanner.nextLine();
String[] info = line.split(" ");
String name = info[0];
int price = Integer.parseInt(info[1]);
int count = Integer.parseInt(info[2]);
goods[i] = new Goods();
// 여기서 각 객체(Goods)와 각각의 배열(goods[i])가 연결됨
// => 배열에 객체의 참조값이 저장됨
goods[i].setGoods(name, price, count);
}
for(int i =0; i < COUNT_GOODS; i++) {
System.out.println(goods[i].getName() +
"(가격: "+ goods[i].getPrice() +"원)이 " +
goods[i].getCount() + "개 입고되었습니다.");
}
scanner.close();
}
}
goods 클래스
public class Goods {
private String name;
private int price;
private int count;
public Goods() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void setGoods(String name, int price, int count) {
setName(name);
setPrice(price);
setCount(count);
}
public void printGoods() {
System.out.println(name +
"(가격: "+ price +"원)이 " +
count + "개 입고되었습니다.");
}
}