2012-11-17 16 views
5

मैं जावा में प्रोग्रामिंग में नया हूं और मुझे नहीं पता कि मेरे कोड में क्या चल रहा है।जावा NullPointerException - लघु कार्यक्रम

यह मुझसे कहता है:

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

मेरे main.java सरल है:

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 

इस 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." 
); 

और 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; 
    } 
} 

जैसा कि आप देख सकते हैं कि मैंने 2 println-s लिखा है और उनमें से दोनों झूठे थे, इसलिए वस्तु मौजूद है! मैं समझता हूँ कि नहीं क्यों यह NullPointerException :(

+0

मैं अनुमान लगाता हूं कि 'खान' देश में कुछ प्रकार की गतिशील सूची है? इससे पहले कि आप इसे जोड़ने का प्रयास करें, क्या इसे आरंभ किया गया है? – Logard

+0

क्या आपने खानों को शुरू किया है? जो मुझे लगता है कि एक सरणीसूची है। –

+0

क्या आप हमें पोस्ट कर सकते हैं कि आपने 'खानों' की घोषणा कैसे की? – Zakaria

उत्तर

4

इस तो विफल हो रहा है पता चलता है:

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

... तो मुझे लगता है mines एक अशक्त संदर्भ है आप इसे या के लिए किसी भी घोषणा नहीं दिखाया। प्रारंभ - लेकिन यह है कि कॉल के अपने पहले बंदरगाह होना चाहिए संभावना है कि यह सिर्फ बदलने का एक मामला है कर रहे हैं:

private List<Mine> mines; 

करने के लिए।

या कुछ इसी तरह के।

+0

ओह! धन्यवाद: डी इसे संरक्षित किया गया था खानों, और अब यह काम करता है! : डी – Iburidu

+1

सुरक्षित होने के बजाय निजी का उपयोग करना बेहतर है, सिवाय इसके कि आपको वास्तव में सुरक्षित उपयोग करने की आवश्यकता है। संरक्षित चरों को उप-वर्गों द्वारा एक्सेस किया जा सकता है और इसमें कुछ संभावित जोखिम हो सकते हैं। –

1

हां, minenull नहीं हो सकता है लेकिन mines के बारे में क्या? जो मुझे लगता है कि यह ArrayList<Mine> है या ऐसा कुछ है, क्या आपने इसे mines = new ArrayList<Mine>() के रूप में inizialize किया? (या जो भी संग्रह है)

1

जब आप संदर्भ पर विधि का आह्वान करते हैं तो शून्य सूचक अपवाद फेंक दिया जाता है।

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

this.mines संदर्भ स्पष्ट रूप से null के बराबर है।

अपने संदर्भ चर नामों को लोअरकेस अक्षरों से शुरू करने का प्रयास करें।

Continent Europe = new Continent("Europe"); 

->

Continent europe = new Continent("Europe"); 

नाम बड़े अक्षरों से शुरू होने के साथ कक्षाओं के लिए 'आरक्षित' कर रहे हैं।

इसे जावा में एक अच्छी शैली माना जाता है।

0

आप कोड

this.mines.add(mine); 
काउंटी वर्ग में

में विफल रहता है।

त्रुटि आप काउंटी वर्ग के भीतर एक स्थानीय चर बनाना चाहिए बायपास करने के लिए आदेश (मामले में आप न यह है) जो

private List<Mine> mines; 

होगा और आप जोड़कर आरंभ होगा निम्नलिखित

mines=new LinkedList<Mine>(); 

उपरोक्त चीज़ को कोड की एक पंक्ति में लिखा जा सकता है लेकिन यह आपके ऊपर है।

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

आप सूची के किसी अन्य कार्यान्वयन का उपयोग कर सकते हैं।

संबंधित मुद्दे