2012-05-26 5 views
1

나는 훌륭한 책인 것처럼 보이는 자바를 배울뿐입니다. 그러나 예제 중 하나를 따르는 데 문제가 있습니다. 다음 코드에서는 간단한 클래스의 멤버 변수를 사용하는 단계가 분명히 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는이 프로그램을 실행하면자바 클래스 멤버 구성

class Dog { 
    String name; 
    String color; 
} 

class DogsExample { 
    public static void main(String[] args) { 

    Dog [] myDogs = new Dog[3]; 

    myDogs[0].name = "Rover"; 
    } 
} 

, 그것은 내가 이름의 멤버 변수에 값을 할당 널 포인터 예외가 발생합니다 : 여기

코드의

$ java DogsExample 
Exception in thread "main" java.lang.NullPointerException 
    at DogsExample.main(DogsExample.java:11) 

왜 그럴 수 없어 이 작업을 수행?

답변

2

Java에서 배열을 만들면 null 값으로 자동 채워집니다 (프리미티브 배열을 사용하는 경우가 아니면 배열에 0이 채워지지 않음).

null 값에 액세스하여 필드를 가져 오는 중입니다. 귀하의 코드는 본질적으로 null.name = "Rover"입니다. myDogs[0]을 유효한 인스턴스로 설정하면 NullPointerException이 발생합니다.

myDogs[0] = new Dog(); 

을 또는이 같은 배열을 할 때 당신은 그것을 할 수 있습니다 :

이 같은 요소에 개의 새로운 인스턴스를 생성 할 수 있습니다

Dog[] myDogs = {new Dog(), new Dog(), new Dog()}; 
+0

대단원! 고마워요, 이제 그 문제를 이해합니다. – jmoxrox

3

이가 비어 있습니다 배열, 세 요소. 3 마리의 개집이 연속적으로 있고 개가 없습니다. myDogs[1]myDogs[2]에 대한

myDogs[0] = new Dog(); 
myDogs[0].name = "Rover"; 

반복 : 당신은 당신이 Dog의 이름을 지정하기 전에 각 사육장에 Dog을 넣어해야합니다.

+2

나는 upvote로 갈 생각 이었지만,이 포스트 미완성 응답의 just-to-be-first-and-then-add-code-later 태도를 좋아하지 않는다. –

+0

@Niklas 이것은 Stack Exchange . 그것은 [서구 문제에서 가장 빠른 총] (http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem)이라고합니다. 불행히도 이것은 upvotes를 확보하는 가장 효과적인 방법이며, 이는 명성 이상의 것보다 중요합니다. –

+0

@ NiklasB., 아마도 우리는이 토론을 메타에 넘길 수 있습니다. 개인적으로, Jon Skeet을 위해 충분한 것은 나에게 충분하다. –

1

개 유형의 배열을 만들었지 만 Dog 객체를 배치하지 않았습니다. 개 [0]은 null입니다.

Dog [] myDogs = new Dog[3]; 

myDogs[0] = new Dog(); // <== This populates the array with a new Dog object 

myDogs[0].name = "Rover";