2016-07-24 2 views
2

Java에 익숙해지기 위해 약간의 게임을 만들려고하고 있으며 LinkedList Index에 문제가 있습니다. 내 문제를 패치 할 수있는 방법을 찾았지만 첫 번째 솔루션이 작동하지 않는 이유를 아직도 이해할 수 없습니다. 이 코드 : 두 경우 0 ... 내 인덱스 시작For 루프 및 LinkedList의 색인 오류

  for (int i=1; i <= PlanetList.size(); i++) 
     { 
      g.drawImage(PlanetList.get(i-1).planetImage, PlanetList.get(i-1).xPos, PlanetList.get(i-1).yPos); 
     } 

건은 다음과 같습니다

 for (int i=0; i <= PlanetList.size(); i++) 
     { 
      g.drawImage(PlanetList.get(i).planetImage, PlanetList.get(i).xPos, PlanetList.get(i).yPos); 
     } 

나에게 java.lang.IndexOutOfBoundsException하지만이 코드를했다. 왜 첫 번째가 나에게 오류를 주는가?

+2

사이트 노트 : Java 코딩 스타일 가이드를 참조하십시오. 변수 이름은 소문자로 시작합니다. 그리고 : 컬렉션의 유형을 변수 이름에 넣지 마십시오. 어쩌면 "planateList"가 오늘 목록 일 수도 있습니다. 아마도 내일 다른 것일 수도 있습니다. 예를 들어 "행성"이라고 부르는 이유는 무엇입니까? 그것은 "하나 이상의 것"에 대해 알려줍니다. 그러나 목록 측면을 "고치는"것을 피합니다. – GhostCat

답변

5

첫 번째 예제의 마지막 인덱스가 허용 된 인덱스 범위를 초과합니다. 예를 들어 목록의 크기가 10 인 경우 허용되는 색인 범위는 [0 9]입니다. 첫 번째 루프에서는 최대 10 개 (i <= PlanetList.size())가됩니다. 터미널 상태를 i < PlanetList.size()으로 변경하여 문제를 해결하십시오.

for (Planet planet : PlanetList) { 
    g.drawImage(planet.planetImage, planet.xPos, planet.yPos); 
} 

3

다른 솔루션은 단순히 인덱스 -를 사용하는 것입니다 자바 for-each loop라고 :

대체 제안했다 @GhostCat로 목록의 요소에 액세스 할 수없는 인덱스를 사용하지 않는 것입니다

for (Planet planet : PlanetList) { 
    g.drawImage(planet.planetImage, planet.xPos, planet.yPos); 

을 또한 코드 중복 그쪽을 제거하는 좋은 부작용으로 : 무료 버전은 년 전에 소개 된 "컬렉션"을 반복하는 당신이 당신의 모범을 보았습니다.

우리가 그것에있는 동안 : 당신은 어떻게 든 "묻지 마십시오"라는 원칙을 위반하고 있습니다. 의미 : 당신은 입니다. 당신의 행성 객체에 당신이 그릴 필요가있는 모든 세부 사항을 요구하고 있습니다. 좋은 객체 지향 디자인에서는이를 피할 수 있습니다. 대신, 오브젝트에 대해 작업을 수행하십시오. 즉 : 당신은 그와

public void drawWith(Graphics g) { ... 

에 행성 클래스를 변경할 수 있기 때문에 위의 코드를 다시 작성할 수 있습니다 : 변수 i가 선언 때문에 경계 오류의 출력을 받고

for (Planet planet : ...) { 
    planet.drawWith(g); 
0

for 루프는 planetlist 크기의 조건과 같지 않은 채로 실행됩니다. 0부터 시작합니다. 링크 된 목록 크기까지 갈 것입니다. 그러나 같음보다 작 으면 루프보다 한 번 더 빠져 나갑니다. for 루프 조건을 연결 목록 크기보다 작게 변경하십시오.

+1

힌트 : 짧은 문장을 찾으십시오. 긴 문장이 구두점없이 3 줄 넘는 것을 피하면 상황을 읽고 이해하는 것이 훨씬 쉬워집니다. 그리고 때로는 약간의 코드가 이해하기가 쉽기도합니다. 그리고 마지막으로 : 다른 사람이 이미 준 것과 똑같은 대답을하려고 노력하고 코드 대신 "언어"를 사용하여 다른 대답을하면 ... 많은 평판을 얻지 못할 것입니다. Vite Falcon의 답변과 비교하면 미안합니다. – GhostCat