2009-08-03 9 views
0

HashMapList는 HashMap 안에 요소를 유지합니다. add 메소드를 호출하면이 오류 메시지가"예외 스레드 "메인" java.lang.NullPointerException이"HashMapList에 추가 할 때"main "java.lang.NullPointerException 예외가 발생했습니다

public class HashMapList<K, V extends Product> extends AbstractList<Product> { 
public V element; 

public int index; 

Map<Integer, V> map; 

public HashMapList() { 
    super(); 
    new HashMap<Integer, V>(); 
} 

// Override 
public void add(int index, V element) { 
    map.put(new Integer(index), element); 

} 
} 

덕분에, 나는 첫 번째 문제를 해결 한하지만 난 == 같은 방법을 추가 호출 할 때>

HashMapList<Integer, Book> list = new HashMapList<Integer, Book>(); 
list.add(0, new Book("physics")); 

및 예약 클래스>

을 ==입니다
public class Book extends Product { 
public String name = null; 
public Book(String name) { 
    super(name); 

    } 
} 

및 제품 클래스>

public class Product implements Comparable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private String name = null; 

public Product(String name) { 
    if (name == null) 
     throw new NullPointerException(); 
    this.name = name; 
    } 

public String getName() { 
    return name; 
    } 

// Override 

public int compareTo(Object o) { 
    Product product = (Product) o; 
    int compare = getName().compareTo(product.name); 
    return compare; 
    } 
} 

을 ==입니다 그리고 난에서 System.out.println (목록)을 기본적으로이 목록을 인쇄 할 때 이 문장은 concole에 표시됩니다 : [[email protected], [email protected], [email protected]]을

+0

위의 코드에있는 몇 가지 포인터 ... 제품 이름이 null 인 경우와 같이 새 예외를 throw 할 때 항상이 null이 발생하지 않아야하는 이유를 설명하는 문자열을 생성자에 넣으십시오. 때로는 사소한 것처럼 들릴지 모르지만 나중에 로그를 읽을 때 자신의 수업과 방법을 올바르게 사용하지 않았다고 자신에게 설명 할 때 감사 할 것입니다. 이것은 "당신이 생성자를 호출하기 전에 변수를 할당하는 것을 잊어 버렸습니다."라는 말로 "여기에 던져진이 수사슴은 ..."이라는 수줍음을 피할 수 있습니다. – Newtopian

+0

다른 포인터 : 각 자손에서 name 변수를 다시 선언하는 대신 , 보호하거나 제품 레벨에서 접근자를 생성하십시오. 당신이하는 일은 대부분의 경우에 효과가 있지만, 데이터가 포함 된 부모 변수 일 때 코드가 자식 이름 변수에 액세스 할 때 이상한 부작용이 발생합니다. 바로 이상한 널 포인터 예외의 좋은 원천이 있습니다 ... 어쨌든 ... 내 2 센트 :-) – Newtopian

+0

지도 = 새 해시 맵 (... 문제? – CsTamas

답변

2

, 당신이 정말로 다른 스레드를 시작해야해야합니다. 개체의 문자열 표현을 올바르게 인쇄하고 있습니다. Book 클래스는 사용자 지정 오버라이드 toString() 메서드를 제공하지 않습니다. 따라서 Object에서 상속받은 클래스를 사용합니다.이 클래스는 클래스의 전체 이름으로 이루어진 문자열과 객체의 hashCode을 반환합니다. 이는보고있는 것입니다. 다른 것을보고 싶다면 toString() 메서드를 재정의해야합니다.

+0

)을 수정 한 후에도 여전히 잘못된 것입니다. toString() 메소드를 의미하고 메서드는 마침표로 시작할 수 없기 때문에 .toString()이 아닙니다. –

3

당신은하지 않습니다 당신은 당신이 사용하는 변수에 값을 할당 할 경우에 널 포인터 예외 모양을 얻을 때마다

public HashMapList() { 
    super(); 
    map = new HashMap<Integer, V>(); 
} 

지도 아무것도 할당. 여기에서 "map = ..."이라고 말하면서 어디서나 코드를 찾으십시오.

2

생성자를 살펴보십시오.

new HashMap<Integer, V>(); 

는 두 번째 질문에 대한

map = new HashMap<Integer, V>(); 
관련 문제