2014-12-02 4 views
-2

pennyCount 메서드 또는 removePenny 메서드를 호출 할 때마다 HashSet이 생성자로 채워 져야하므로 null 포인터 예외 오류가 발생합니다. 왜 내가이 문제를 어떻게 해결할 수 있습니까?왜 java.lang.NullPointerException 오류가 발생합니까?

import java.util.HashSet; 

public class Pocket 
{ 

private HashSet<Penny> penniesSet; 



public Pocket(int numOfPennies){ 

    HashSet<Penny> penniesSet = new HashSet<Penny>(); 

    for(int n = 0; n < numOfPennies; n++){ 
     penniesSet.add(new Penny());} 



} 

public int pennyCount(){ 
    return penniesSet.size(); 

} 

public Penny removePenny(){ 

    if(penniesSet.size() == 0){ 
     return null; 
    } 
    else{ 
     Penny toRemove = penniesSet.iterator().next(); 
     penniesSet.remove(toRemove); 
     return toRemove; 

    } 
} 

} 생성자에서

+0

무언가가 null이 될 수 있습니다. :) NullPointerException이 발생합니다. :) – subash

답변

0

, 당신은 그것은 당신이 새로운 HashSet의 penniesSet을 선언하는 당신의 생성자에서

penniesSet = new HashSet<Penny>(); 
0

을해야

HashSet<Penny> penniesSet = new HashSet<Penny>(); 

다음 한이 있어야한다 :

public Pocket(int numOfPennies){ 

     penniesSet = new HashSet<Penny>(); 

     for(int n = 0; n < numOfPennies; n++){ 
      penniesSet.add(new Penny());} 
} 

그렇지 않으면 pennieSet이 초기화되지 않습니다.

0

이 같은

public Pocket(int numOfPennies){ 

    penniesSet = new HashSet<Penny>(); // was HashSet<Penny> penniesSet = new HashSet<Penny>(); 

    for(int n = 0; n < numOfPennies; n++){ 
     penniesSet.add(new Penny());} 



} 
+0

답변이 좋았지 만 OP 문제를 해결하는 방법에 대한 설명을 추가 할 수 있습니까? – thegrinner

+0

내 대답은 모든 사람이 elses, 무슨 oop 문제입니까? – outdev

+0

그들 중 대부분은 왜 그 라인을 수정하여 (즉, OP가 그것을 다시 선언 할 때 변수가 그림자로 처리되는지) 약간의 세부 사항을 설명합니다. 리뷰 큐에서 (주로 코드이기 때문에) 그것을 보았 기 때문에 나는 당신의 대답에 댓글을 달았습니다. 그냥 참고하시기 바랍니다 :) – thegrinner

0

변화를보십시오.

public Pocket(int numOfPennies){ 

    penniesSet = new HashSet<Penny>(); 

    for(int n = 0; n < numOfPennies; n++){ 
     penniesSet.add(new Penny());} 

} 
+1

만약 당신이 설명하면 좋을 것입니다. OP의 문제점은 무엇이고 어떻게 해결할 수 있습니까? – blalasaadri

0

변화

public Pocket(int numOfPennies){ 

    HashSet<Penny> penniesSet = new HashSet<Penny>(); 

    for(int n = 0; n < numOfPennies; n++){ 
     penniesSet.add(new Penny());} 



} 

public Pocket(int numOfPennies){ 

    penniesSet = new HashSet<Penny>(); //set the instance variable instead of creating a local variable 

    for(int n = 0; n < numOfPennies; n++){ 
     penniesSet.add(new Penny());} 



} 
0

에 당신은 생성자에서 새로운 개체를 만드는 대신 클래스의 필드를 채우는 있습니다. 시도해보십시오 :

1

동일한 이름으로 두 개의 HashSet을 만들고 필드에 하나의 생성자를 만듭니다. 그러면 로컬 변수가 인스턴스화됩니다. pennyCount()에 도달 할 때까지 필드는 여전히 null입니다.

private HashSet<Penny> penniesSet; //first here 

public Pocket(int numOfPennies){ 
    HashSet<Penny> penniesSet = new HashSet<Penny>(); //then here 

수정하려면 다음과 같이하십시오.

private HashSet<Penny> penniesSet; 

public Pocket(int numOfPennies){ 
    penniesSet = new HashSet<Penny>();