2012-11-17 14 views
5

Sono nuovo nella programmazione in Java e non capisco cosa sta succedendo nel mio codice.Java NullPointerException - Short Program

Mi dice:

Exception in thread "main" java.lang.NullPointerException 
    at Main.Country.addMine(Country.java:37) 
    at Main.Main.main(Main.java:21) 
Java Result: 1 

mio main.java è semplice:

Continent Europe = new Continent("Europe"); 
    Country asd = new Country("asd", Europe); 
    Mine mine = new Mine(100,100,100,100); 
    System.out.println(mine == null); 
    asd.addMine(mine); //dies here 

questo è il metodo addMine:

public void addMine(Mine mine) { 
    System.out.println(mine == null); 
    this.mines.add(mine); //dies here 
    this.iron += mine.iron; 
    this.gold += mine.gold; 
    this.stone += mine.stone; 
    this.wood += mine.wood; 
    System.out.println("Mine has been successfully added to the country with the given values." 
); 

e Mine.java è:

public class Mine implements Building { //Building is an empty interface :) 
    protected int iron; 
    protected int gold; 
    protected int stone; 
    protected int wood; 
    public Mine(int iron, int gold, int stone, int wood) { 
     this.iron += iron; 
     this.gold += gold; 
     this.stone += stone; 
     this.wood += wood; 
    } 
} 

Come potete vedere ho scritto 2 println-s ed erano entrambi falsi, quindi l'oggetto esiste! Non capisco il motivo per cui si vede NullPointerException :(

+0

Imporre "mine" è una sorta di elenco dinamico nel Paese? È inizializzato prima di provare ad aggiungerlo? – Logard

+0

Hai inizializzato le mine? che è un arraylist credo. –

+0

Puoi pubblicare come hai dichiarato "mine"? – Zakaria

risposta

4

Se questo sta fallendo:

this.mines.add(mine); //dies here 

... poi ho il sospetto mines è un riferimento null Non hai mostrato alcuna dichiarazione per esso o. inizializzazione - ma che dovrebbe essere il primo porto di scalo probabilità sono è solo un caso di cambiamento:

private List<Mine> mines; 

a

.

o qualcosa di simile.

+0

oh! grazie: D era protetto Elenco mine, e ora funziona! : D – Iburidu

+1

È preferibile utilizzare private anziché protette, a meno che non sia davvero necessario utilizzare protetto. Le variabili protette sono accessibili da sottoclassi e questo può avere alcuni rischi potenziali. –

1

Sì, mine potrebbe non essere null ma che dire di mines? Che immagino sia un ArrayList<Mine> o qualcosa del genere, l'hai inizializzato come mines = new ArrayList<Mine>()? (o qualsiasi raccolta sia)

1

L'eccezione di puntatore nullo viene generata quando si richiama il metodo sul riferimento che è null.

this.mines.add(mine); //dies here 

this.mines riferimento è ovviamente pari a null.

Provare anche a fare in modo che i nomi delle variabili di riferimento inizino con lettere minuscole.

Continent Europe = new Continent("Europe"); 

->

Continent europe = new Continent("Europe"); 

nomi con lettere maiuscole di partenza sono 'riservati' per le classi.

È considerato un buon stile in Java.

0

codice È fallisce nel

this.mines.add(mine); 

in classe County.

Al fine di bypassare l'errore è necessario creare una variabile locale all'interno della classe County (nel caso in cui tu non farlo), che sarà

private List<Mine> mines; 

e si inizializzare aggiungendo il seguente

mines=new LinkedList<Mine>(); 

Questa frase può essere scritta in una riga di codice, ma dipende da voi.

private List<Mine> mines=new LinkedList<Mine>(); 

È possibile utilizzare qualsiasi altra implementazione di Elenco.