[JAVA] java.lang.NullPointerException - 참조변수가 null값을 가질때

LeeJunO·2023년 6월 28일
0

JAVA Errors

목록 보기
3/3

오늘도 어김없이 자바 코딩 문제를 풀다가 오류에 직면했다.

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 + "개 입고되었습니다.");
	}
}

0개의 댓글