2014-02-17 4 views
0

짧은 질문이 있는데 첫 번째 예제가 작동하지 않고 두 번째 작동하는 이유를 말해주십시오. 예 전에 코드 :Specific NullPointerException Java

Tiles[] myTiles = new Tile[23]; 
number = 1; 

첫 번째 예 :

for(Tile tile : this.myTiles) { 
    if (number != this.myTiles.length) { 
     tile = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
     number++; 
    } 
} 

두 번째 예 :

for(Tile tile : this.myTiles) { 
    if (number != this.myTiles.length){ 
     this.myTiles[number-1] = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
     number++; 
    } 
} 

내가 수업 시간에 다른 방법으로 아래의 코드를 사용하는 경우

this.myTiles[0].getNumber(); 

그것은이다 NullPointerE xception.
하지만 두 번째 예에서는 멋지게 작동합니다.

정말 이유를 모르겠습니다. 어떤 응답

+3

:

그래서 자바에서 배열을 수정하는 관용적 인 방법은 같은 것입니다. – user2336315

+0

첫 번째 예제의 타일이 내 배열의 객체와 관련이 없습니까? – user2899587

+0

어떤 유형이'myTiles'입니까 –

답변

1

제 루프 덕분 각 객체의 복사본을 만들고 개체 배열의 요소는 기본적으로 null되어 이들 루프의 범위에 할당 남아있을

for (int i=0; i < myTiles.length; i++) { 
    Tile tile; 
    ... 
    tile = new Tile(...); // set local reference only 
} 

동일하다. 이 참조를 덮어 쓰는 것은 완전히 쓸모있다 - 각 루프가 컬렉션에서 항목을 가져 당신에게 각 요소를 포함하는 지역 변수에 대한 새로운 참조를 반환하기 위해 내부적으로 Iterator를 사용하기위한 myTiles의 원래 요소는 null

에게 기본에
+0

왜 복사 만 할까? 타일은 배열 myTiles에서 객체에 대한 보완책입니다. – user2899587

+0

for 루프가 배열 요소 중 하나에도 할당되지 않은 로컬 참조를 만듭니다. – Reimeus

+0

아, 알겠습니다. 오늘 감사합니다. – user2899587

1

남아 , 이는 하나의 for-loop에서만 유효하므로 다음 번에 대체 될 것입니다. 자바에서

for (Iterator<Tile> iterator = myTiles.iterator(); iterator.hasNext;){ 
    Tile tile = iterator.next(); 
    tile = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
    number++; 
} 
0

가 직접 포인터를 조작 같은 건 없다에

"내부적으로는"첫 번째 루프는 번역하는 것입니다. 오브젝트에 대한 참조를 얻을 때마다 포인터에 대한 포인터와 같은 참조로 사본을 얻게됩니다. 함수가 그 기준에 사본을 조작하기 때문에 당신은 실제로 원래의 참조를 s을 변경할 수 없습니다

String s = "hello"; 
modify(s); 
System.out.println(s); // still hello! 

void modify(String s){ 
    s = s + " world"; 
} 

: 이러한 이유로 당신이 그런 짓을합니다. 위의 예에서 다음과 같은 내용이 필요합니다.

String s = "hello"; 
s = modify(s); 
System.out.println(s); // prints 'hello world' 

String modify(String s){ 
    return s + " world"; 
} 

귀하의 이해력은 같습니다. 변수 tile은 루프에 바인딩되어 있으며 배열의 참조 사본입니다. 원래의 참조 (주어진 위치의 배열)는이 방법으로 직접 변경할 수 없습니다.

myTiles[i] = // something 

읽기 this article 더 많은 정보 : 직접 호출해야하는 이유입니다. 당신은 루프에 대한 첫 번째 배열에서 개체를 수정되지 않기 때문에

for(int i = 0; i < myTiles.length; i++){ 
    myTiles[i] = new Tile(...); // directly reassigning the reference in the array! 
}