# java.lang.NullPointerException was ist das?



## Pennywiser (25. Sep 2006)

Hallo hab mal ne frage bzw. ein problem. Hab das folgende Programm in der Schule gemacht, wir sollten dann noch ne zusatzaufgabe machen. als ich nun fertig war und den folgenden Quelltext hatte. hab ich das programm mal gestartet... das erste applet öffnet sich einwand frei nur wenn man dann auf "open" klickt bekomme ich ne fehlermeldung "java.lang.NullPointerException"
weiss jemand was das ist oda wie man es behebt??

vielen dank im voraus

Code: 

```
import java.awt.*; 
import java.awt.event.*; 
import java.applet.*; 

public class Third extends Applet implements ActionListener 
{ 
    private TestWindow myWindow; 
    
    private Button buttonOpen; 
    private Button buttonEnlarge; 
    private Button buttonReduce; 
    private Button buttonClose; 
    
    private int sizeX = 0; 
    private int sizeY = 0; 
    
    
    public void init() 
    { 
        setLayout (new FlowLayout (FlowLayout.LEFT, 2, 0)); 
        
        setBackground (Color.white); 
        
        buttonOpen      = new Button ("Open"); 
        buttonEnlarge   = new Button ("Enlarge"); 
        buttonReduce    = new Button ("Reduce"); 
        buttonClose     = new Button ("Close"); 
        
        add (buttonOpen); 
        add (buttonEnlarge); 
        add (buttonReduce); 
        add (buttonClose); 
        
        buttonOpen.addActionListener (this); 
        buttonEnlarge.addActionListener (this); 
        buttonReduce.addActionListener (this); 
        buttonClose.addActionListener (this); 
        
        buttonEnlarge.setEnabled (false); 
        buttonReduce.setEnabled (false); 
        buttonClose.setEnabled (false); 
    } 
    
    
    public void actionPerformed (ActionEvent event) 
    { 
        if (event.getSource () == buttonOpen)       { openWindow    (); } else 
        if (event.getSource () == buttonEnlarge)    { enlargeWindow (); } else 
        if (event.getSource () == buttonReduce)     { reduceWindow  (); } else 
        if (event.getSource () == buttonClose)      { closeWindow   (); } 
    } 
    
    
    private void openWindow () 
    { 
        if (myWindow == null) 
        { 
            sizeX = 300; 
            sizeY = 200; 
            myWindow = new TestWindow   ("TestWindow", sizeX, sizeY); 
            myWindow.show (); 
            
            buttonOpen.setEnabled (false); 
            buttonEnlarge.setEnabled (true); 
            buttonReduce.setEnabled (true); 
            buttonClose.setEnabled (true); 
        } 
    } 
    
    
    private void enlargeWindow () 
    { 
        if (myWindow != null) 
        { 
            myWindow.setSize (sizeX += 100, sizeY += 100); 
            myWindow.requestFocus (); 
        } 
    } 
    
    
    private void reduceWindow () 
    { 
        if (myWindow != null) 
        { 
            if ((sizeX >= 100) & (sizeY >= 100)) 
            { 
                myWindow.setSize (sizeX -= 100, sizeY -= 100); 
                myWindow.requestFocus (); 
            } 
        } 
    } 
    
    
    private void closeWindow () 
    { 
        if (myWindow != null) 
        { 
            myWindow.dispose (); 
            myWindow = null; 
            
            buttonOpen.setEnabled (true); 
            buttonEnlarge.setEnabled (false); 
            buttonReduce.setEnabled (true); 
            buttonClose.setEnabled (false); 
        } 
    } 
} 
 


und TestWindow 
Code: 

import java.awt.*; 
import java.awt.event.*; 


public class TestWindow extends Frame implements ActionListener 
{ 
    private MenuBar menuBar; 
    
    private Menu menuFile; 
    private Menu menuColors; 
    private Menu menuGraphic; 
    private Menu menuWindow; 
    
    private MenuItem itemFirst; 
    private MenuItem itemSecond; 
    private MenuItem itemBlue; 
    private MenuItem itemYellow; 
    private MenuItem itemGreen; 
    private MenuItem itemRectangle; 
    private MenuItem itemTriangle; 
    private MenuItem itemOval; 
    private MenuItem itemLine; 
    private MenuItem itemClear; 
    private MenuItem itemClose; 
    
    private String symbol;    
    private String pushedItem; 
    private String showString = ""; 
    
    
    public TestWindow (String frameTitle, int x, int y) 
    { 
        super (frameTitle); 
        
        menuBar = new MenuBar (); 
        setMenuBar (menuBar); 
        
        menuFile = new Menu ("File"); 
        menuBar.add (menuFile); 
        
        itemFirst = new MenuItem ("First"); 
        itemSecond = new MenuItem ("Second"); 
        
        itemFirst.addActionListener (this); 
        itemSecond.addActionListener (this); 
        
        menuFile.add (itemFirst); 
        menuFile.add (itemSecond); 
        
        menuColors = new Menu ("Colors"); 
        menuBar.add (menuColors); 
        
        itemBlue    = new MenuItem ("Blue"); 
        itemYellow  = new MenuItem ("Yellow"); 
        itemGreen   = new MenuItem ("Green"); 
        
        itemBlue.addActionListener (this); 
        itemYellow.addActionListener (this); 
        itemGreen.addActionListener (this); 
        
        menuColors.add (itemBlue); 
        menuColors.add (itemYellow); 
        menuColors.add (itemGreen); 
        
        menuWindow = new Menu ("Graphic"); 
        menuBar.add (menuGraphic); 
        
        itemRectangle   = new MenuItem ("Rectangle"); 
        itemTriangle    = new MenuItem ("Triangle"); 
        itemOval        = new MenuItem ("Circle"); 
        itemLine        = new MenuItem ("Line"); 
        
        itemRectangle.addActionListener (this); 
        itemTriangle.addActionListener (this); 
        itemOval.addActionListener (this); 
        itemLine.addActionListener (this); 
        
        menuGraphic.add (itemRectangle); 
        menuGraphic.add (itemTriangle); 
        menuGraphic.add (itemOval); 
        menuGraphic.add (itemLine); 
        
        menuWindow = new Menu ("Window"); 
        menuBar.add (menuWindow); 
        
        itemClear = new MenuItem ("Clear"); 
        itemClose = new MenuItem ("Close"); 
        
        itemClear.addActionListener (this); 
        itemClose.addActionListener (this); 
        
        menuWindow.add (itemClear); 
        menuWindow.addSeparator (); 
        menuWindow.add (itemClose); 
        
        addWindowListener (new WindowAdapter () 
        { public void windowClosing (WindowEvent windowEvent) 
          { dispose (); }} ); 
          
        Cursor cursor = new Cursor (Cursor.CROSSHAIR_CURSOR); 
        setCursor (cursor); 
        
        setBackground (Color.white); 
        setSize (x, y); 
    } 
    
    
    public void actionPerformed (ActionEvent event) 
    { 
        pushedItem = event.getActionCommand (); 
        
        if (event.getSource () == itemFirst)    { showMessage ();                       } else 
        if (event.getSource () == itemSecond)   { showMessage ();                       } else 
        if (event.getSource () == itemBlue)     { setWindowBackground (Color.blue);     } else 
        if (event.getSource () == itemYellow)   { setWindowBackground (Color.yellow);   } else 
        if (event.getSource () == itemGreen)    { setWindowBackground (Color.green);    } else 
        if (event.getSource () == itemRectangle){ setSymbol ("r");                      } else 
        if (event.getSource () == itemTriangle) { setSymbol ("t");                      } else 
        if (event.getSource () == itemOval)     { setSymbol ("o");                      } else 
        if (event.getSource () == itemLine)     { setSymbol ("l");                      } else 
        if (event.getSource () == itemClear)    { clearWindow ();                       } else 
        if (event.getSource () == itemClose)    { closeWindow ();                       } 
    } 
    
    
    private void setSymbol(String symbol) 
    { 
        if(symbol == "r") {this.symbol = "Rectangle"; } else 
        if(symbol == "t") {this.symbol = "Triangle";  } else 
        if(symbol == "o") {this.symbol = "Oval";      } else 
        if(symbol == "l") {this.symbol = "Line";      } 
        repaint(); 
    } 

    
    private void setWindowBackground (Color color) 
    { 
        setBackground (color); 
    } 
    
    private void showMessage () 
    { 
        showString = "You took the " + pushedItem + " MenuItem!"; 
        repaint (); 
    } 
    
    private void clearWindow () 
    { 
        showString = ""; 
        setBackground (Color.white); 
        repaint (); 
    } 
    
    private void closeWindow () 
    { 
        dispose (); 
    } 
    
    public void paint (Graphics graphics) 
    { 
        graphics.drawString (showString, 10, 70); 
        if(this.symbol == "Rectangle"){graphics.drawRect (10, 50, 50, 50); } else 
        if(this.symbol == "Triangle") 
        { 
            int[] xs = {10,50,60,10}; 
            int[] ys = {10,30,70,10}; 
            graphics.drawPolygon (xs,ys,3); 
        } 
        else 
        if(this.symbol == "Oval"){graphics.drawOval (10, 50, 50, 50); } else 
        if(this.symbol == "Line"){graphics.drawLine (10, 50, 50, 50); } 
    } 
}
```


----------



## hupfdule (25. Sep 2006)

Eine NullPointerException tritt auf, wenn du eine Methode auf einem Objekt aufrufst, dieses Objekt aber nicht vorhanden ist. Die Variable, die auf das Objekt verweisen sollte, ist null. Daher NullPointerException.

Ich habe wenig Lust deinen gesamten Quellcode zu lesen, daher schreib mal noch, in welcher Zeile die NPE auftritt (ist in der Exception mit angegeben).


----------



## SlaterB (25. Sep 2006)

ach macht doch Spass 

menuGraphic wird nirgendwo erzeugt?


 menuWindow = new Menu ("Graphic"); 
wäre wohl die richtige Stelle


----------



## Pennywiser (25. Sep 2006)

Jo vielen dank, hab einfach das MenuWindow mit menuGraphic ersetzt weil Window ja darunter schon kommt^^
eine kleine feinheit ist jetzt noch und zwar macht clearWindow das fenster leider nicht leer obwohl als showString "" nichts stehen dürfte, aber sind leider noch die texte von den anderen Menüpunkten drin...


----------



## Bert Brenner (25. Sep 2006)

this.symbol == "Rectangle"

@Pennywiser: 

Kleiner Quiz: Warum sollte man sowas nicht schreiben?


----------



## Pennywiser (25. Sep 2006)

^^
keine Ahnung haben in der Schule in dieser Form gemacht...
seit nicht zu hart mit mir bin erst seit kurzem bei java dabei^^

warum sollte man es denn nicht so machen??


----------



## Pennywiser (25. Sep 2006)

Sehs grad hab im Quelltext nicht == stehen sondern ein einfaches =   ;-)


----------



## SlaterB (25. Sep 2006)

in der paint-Operation hast du
 if(this.symbol == "Rectangle"){..

da muss 
 if(this.symbol.equals("Rectangle")){
bzw.
 if("Rectangle".equals(this.symbol)){ 
welches auch funktioniert, wenn die Variable null ist,

----------

bau in deine paint doch mal 
System.out.println("showString ist: "+showString);
ein, was kommt da raus?


----------

