2010-03-11 3 views
1
for (Player p : players) 
{ 
    p.addCard(deck.dealCard()); 
    p.addCard(deck.dealCard()); 
} 

Java :이 두 코드가 같은가요?

for (int i = 0; i < players.size() ; i++) 
{ 
    Player p = players.get(i); 
    p.addCard(deck.dealCard()); 
    p.addCard(deck.dealCard()); 
} 

두 번째 코드는 아래 1 당량을 만들기 위해 무엇을 할 수 있는지 널 포인터 예외를 yeilds?

+9

선수 유형은 무엇입니까? –

+1

예외가 SVP에 던져지는 곳으로 좀 더 구체적으로 표현해 주실 수 있습니까? – Anzurio

+0

java.lang.NullPointerException이 PokerGame.dealRound (PokerGame.java:105) PokerGame.play에서 \t (PokerGame.java:38) PokerGame.main에서 \t (PokerGame.java:202) 라인에 \t 105는 p.addCard (deck.dealCard())입니다. – dukevin

답변

1

나는 이런 일을 볼 수 있습니다.

내가 생각할 수있는 유일한 점은 코드에서 우리에게 보여주지 않는 것이 무언가 잘못된 것을 유발하고 있다는 것입니다.

이렇게하면 어떻게됩니까?

for (Iterator<Player> playerIter = players.iterator(); playerIter.hasNext();) 
{ 
    Player p = playerIter.next(); 
    p.addCard(deck.dealCard()); 
    p.addCard(deck.dealCard()); 
} 

편집 :

그냥 AZ's response을 읽고, 그것은뿐만 아니라 이상한 행동이있다 size()을 있다고 확실히 가능합니다.

+0

그것은 "다음() java.util.Iterator (int)에 적용 할 수 없습니다" – dukevin

+0

@ Kevin - 'playerIter.next()'로 변경하고 다시 시도하십시오. –

+0

죄송합니다. 코드를 복사하여 붙여 넣기 만하고 매개 변수를 삭제하는 것을 잊어 버렸습니다. 나는 정확성을 위해 갱신 할 것이다. –

2

Player에 대한 자세한 내용을 모르면 당연히 할 수 있으며 참조하기 전에 p이 null인지 확인하십시오.

+0

하지만 p는 처음에 잘 작동합니다 왜 맨 아래 인스턴스에서 작동하지 않습니까? (2 개의 명령문이 같은 경우)? – dukevin

+2

@ Kevin : 그것은 첫 번째 스 니펫에 대해 [암시 적으로] 사용 된 반복자가 "크기"를 감지하는 다른 방법을 사용하기 때문입니다. – mjv

+0

@ Kevin : 또 다른 가능성은 iterator가 "collection"에서'null' 값을 걸러 내고 있다는 것입니다. –

3

이것은 매우 가청스러운 추측 일 것입니다. size()은 플레이어의 플레이어 수는 아니지만 플레이어의 총 용량을 산출 할 수 있습니다. 그리고 플레이어 용 반복자는 할당 된 항목에 대해서만 반복합니다.

제목에서 질문에 대한 답변을 얻으려면 두 코드 스 니펫이 반드시 동일하지 않아도됩니다. for-each 구조는 반복자를 사용하며 코드 생성자는 어떤 플레이어 유형이든 가장 적합한 것으로 간주되는 구현을 사용할 수있었습니다. 선 이후

for (Iterator<Player> i = players.iterator(); i.hasNext();){ 
     Player p = i.next(); 
     //... Your code here 
} 
+0

이것을 다음 코드처럼 보이도록 대체했습니다. 여전히 동일한 null을 나타냅니다. 포인터 예외. (반복자 players.iterator I =()에 대한 ; i.hasNext() { 플레이어 P = i.next(); p.addCard (deck.dealCard()); p.addCard (갑판 .dealCard()); } – dukevin

1

p.addCard(deck.dealCard()); 다음

  1. 페이지 중 하나가 null 또는
  2. 데크가 null 또는
  3. 인 경우 NullPointerException을 던지고있다 : 당신의 for-each 구조의 for 동등한 더 같이해야

  4. dealCard() 메소드가 예외를 발생시키고 있습니다.

가능하면 컬렉션 용 반복자를 사용해야합니다. addCard 또는 dealCard는 어떻게 든이 ConcurrentModificationException에서 발생할 수있어, 아마도 둘 players의 내용이 수정되지 (참조 players 무엇을 변경할 때 나는 NullPointerException가 두 번째 경우에 발생되는 위치를 생각할 수

Iterator<Player> iter = players.iterator(); 
while(iter.hasNext()){ 
    Player p = iter.next(); 
    p.addCard(deck.dealcard()); 
    //etc. 
} 
+0

하지만 첫 번째 코드 스 니펫에서 null이 아닌 이유는 무엇입니까? – dukevin

+0

두 코드 모두 코드의 다른 모든 항목이 동일합니까? –

+0

네, 정확히 똑같은, 그냥이 더 나은 이해를 얻으려면 각 루프를 다시 작성하려고 해요 – dukevin

1

한 시나리오는 첫 번째 스 니펫).

여기에 (당신이 어떤 의심이 있으면 자신이 실행하시기 바랍니다) 예입니다 :

import java.util.*; 

public class ForEachVS { 
    static List<Integer> players; 
    static void process(int i) { 
     System.out.println(i); 
     players = null; 
    } 
    public static void main(String args[]) { 
     players = Arrays.asList(1,2,3); 
     for (int p : players) { 
      process(p); 
     } // this processes 1,2,3 
     players = Arrays.asList(1,2,3); 
     for (int i = 0; i < players.size(); i++) { 
      process(players.get(i)); 
     } // this processes 1, then throws NullPointerException 
    } 
} 

을 그래서 당신이 볼 수 있듯이, 두 구조가 실제로 정확하게 해당되지 않습니다. 위의 코드 조각의 본질은 간결하게 여기 제시 : 첫 번째 루프는 잘 갔다 발견 할 것이다

int[] arr; 

    arr = new int[5]; 
    for (int x : arr) { 
     arr = null; 
    } 

    arr = new int[5]; 
    for (int i = 0; i < arr.length; i++) { 
     arr = null; 
    } 

, 두 번째 루프는 NullPointerException를 throw있다. 따라서 대부분의 경우, 두 구성은 정확히 100 % 동등하지 않습니다. playersget() 구현이 고장, 또는 어떤 속도로, (java.util.List의 동작과 다릅니다) 예상치 못한 방식으로 동작 사용자 정의 java.lang.Iterable 경우

0

to snippets의 유일한 차이점은 p에 대한 값을 가져 오는 방법입니다. 첫 번째 자바에서는 플레이어를 반복하고, 두 번째에서는 명시 적으로 수행합니다. 널 포인터 오류의 가장 큰 원인은 p가 널 (null) 인 것입니다. 데크가 null의 경우, 양쪽 모두의 단발기가 null 예외를 슬로우합니다. addCard와 dealCard도 마찬가지입니다. 어느 쪽의 메소드도 양쪽 모두의 스킵이 null 포인터 에러를 슬로우하면 (자) 발생합니다.

자바의 for-each 구문이 루프 본문을 실행하기 전에 null을 검사하고있는 것 같습니다.

의 차이에 대한이 질문에 회담 : Java for each vs regular for -- are they equivalent?