Seltsame Fehlermeldung



  • Hallo,

    ich habe erst vor kurzem mit Java angefangen und stehe schon jetzt vor einem fuer mich unloesbaren Problem. 🙄

    Der folgende Code ist aus einem Buch zum Lernen der Sprache entnommen und sollte eigentlich einen Taschenrechner produzieren.

    /*
    	Chapter 6: Java Calculator
    	Programmer: Benedikt Achatz
    	Date: April, 11 2007
    	Filename: Calculator.java
    	Purpose: This program creates a calculator with menu
    */
    
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.datatransfer.*;
    import java.text.DecimalFormat;
    import javax.swing.JOptionPane;
    
    public class Calculator extends Frame implements ActionListener
    {
    	private Button keys[];
    	private Panel keypad;
    	private TextField lcd;
    	private double op1;
    	private boolean first;
    	private boolean foundKey;
    	private boolean clearText;
    	private int last0p;
    	private DecimalFormat calcPattern;
    
    	public Calculator()
    	{
    		//create an instance of the menu
    		MenuBar mnuBar = new MenuBar();
    		setMenuBar(mnuBar);
    
    		//construct and popilate the File menu
    		Menu mnuFile = new Menu("File",true);
    		mnuBar.add(mnuFile);
    			MenuItem mnuFileExit = new MenuItem("Exit");
    			mnuFile.add(mnuFileExit);
    
    		//construct and populate the edit menu
    		Menu mnuEdit = new Menu("Edit",true);
    		mnuBar.add(mnuEdit);
    			MenuItem mnuEditClear = new MenuItem("Clear");
    			mnuEdit.add(mnuEditClear);
    			mnuEdit.insertSeparator(1);
    			MenuItem mnuEditCopy = new MenuItem("Copy");
    			mnuEdit.add(mnuEditCopy);
    			MenuItem mnuEditPaste = new MenuItem("Paste");
    			mnuEdit.add(mnuEditPaste);
    
    		//construct and populate the about menu
    		Menu mnuAbout = new Menu("About",true);
    			mnuBar.add(mnuAbout);
    			MenuItem mnuAboutCalculator = new MenuItem("About Calculator");
    			mnuAbout.add(mnuAboutCalculator);
    
    		//add the ActionListener to each menu item
    		mnuFileExit.addActionListener(this);
    		mnuEditClear.addActionListener(this);
    		mnuEditCopy.addActionListener(this);
    		mnuEditPaste.addActionListener(this);
    		mnuAboutCalculator.addActionListener(this);
    
    		//assign an ActionCommand ti each menu item
    		mnuFileExit.setActionCommand("Exit");
    		mnuEditClear.setActionCommand("Clear");
    		mnuEditCopy.setActionCommand("Copy");
    		mnuEditPaste.setActionCommand("Paste");
    		mnuAboutCalculator.setActionCommand("About");
    
    		//construct components and initialize beginning
    		lcd = new TextField(20);
    			lcd.setEditable(false);
    		keypad = new Panel();
    		keys = new Button[16];
    		first = true;
    		op1 = 0.0;
    		clearText = true;
    		last0p = 0;
    		calcPattern = new DecimalFormat("########.########");
    
    		//construct and assign captrons to the Buttons
    		for(int i=0; i<=9; i++)
    			keys[i] = new Button(String.valueOf(i));
    
    		keys[10] = new Button("/");
    		keys[11] = new Button("*");
    		keys[12] = new Button("-");
    		keys[13] = new Button("+");
    		keys[12] = new Button("=");
    		keys[14] = new Button(".");
    
    		//set Frame and keypad layout to grid layout
    		setLayout(new BorderLayout());
    		keypad.setLayout(new GridLayout(4,4,10,10));
    
    		for(int i=7; i<=10; i++) //7,8,9, divide
    			keypad.add(keys[i]);
    
    		for(int i=4;i<=6;i++) //4,5,6
    			keypad.add(keys[i]);
    
    		keypad.add(keys[11]); //multiply
    
    		for(int i=1; i<=4; i++) //1,2,3
    			keypad.add(keys[i]);
    
    		keypad.add(keys[12]); //subtract
    
    		keypad.add(keys[0]); //0 key
    
    		for(int i=15; i>=13; i--)
    			keypad.add(keys[i]); //decimal point, =, add + keys
    
    		for(int i=0; i<keys.length; i++)
    			keys[i].addActionListener(this);
    
    		add(lcd,BorderLayout.NORTH);
    		add(keypad,BorderLayout.CENTER);
    
    		addWindowListener(
    			new WindowAdapter()
    			{
    				public void windowClosing(WindowEvent e)
    				{
    					System.exit(0);
    				}
    			}
    		);
    
    	}//end of constructor method
    
    	public void actionPerformed(ActionEvent e)
    	{
    		//test for menu item clicks
    		String arg = e.getActionCommand();
    		if(arg == "Exit")
    			System.exit(0);
    
    		if(arg == "Clear")
    		{
    			clearText = true;
    			first = true;
    			op1 = 0.0;
    			lcd.setText("");
    			lcd.requestFocus();
    		}
    
    		if (arg == "Copy")
    		{
    			Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
    			StringSelection contents = new StringSelection(lcd.getText());
    			cb.setContents(contents, null);
    		}
    
    		if(arg == "Paste")
    		{
    			Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
    			Transferable content = cb.getContents(this);
    			try
    			{
    				String s = (String)content.getTransferData(DataFlavor.stringFlavor);
    				lcd.setText(calcPattern.format(Double.parseDouble(s)));
    			}
    			catch (Throwable exc)
    			{
    				lcd.setText("");
    			}
    		}
    
    		if(arg == "About")
    		{
    			String message = "Calculator ver. 1.0\nOpenExibit_Software\nCopyright 2007\nAll rights reserved";
    			JOptionPane.showMessageDialog(null,message,"About Calculator", JOptionPane.INFORMATION_MESSAGE);
    		}
    
    		//test for button clicks
    		foundKey = false;
    
    		//search for the clicked key
    		for (int i=0; i<keys.length && !foundKey; i++)
    		{
    			if(e.getSource() == keys[i])
    			{
    				foundKey = true;
    				switch(i)
    				{
    					//number and decimal point buttons
    					case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:case 8: case 9: case 15:
    						if(clearText)
    						{
    							lcd.setText("");
    							clearText = false;
    						}
    						lcd.setText(lcd.getText() + keys[i].getLabel());
    						break;
    
    					//operator buttons
    					case 10: case 11: case 12: case 13: case 14:
    						clearText = true;
    
    						if(first)
    						{
    							if(lcd.getText().length()==0) op1 = 0.0;
    							else op1 = Double.parseDouble(lcd.getText());
    
    							first = false;
    							clearText = true;
    							last0p = i; //save operator
    						}
    						else //second operand
    						{
    							switch(last0p)
    							{
    								case 10: //divide button
    									op1 /= Double.parseDouble(lcd.getText());
    									break;
    								case 11: //multiply button
    									op1 *= Double.parseDouble(lcd.getText());
    									break;
    								case 12:
    									op1 -= Double.parseDouble(lcd.getText());
    									break;
    								case 13:
    									op1 += Double.parseDouble(lcd.getText());
    									break;
    							} //end of switch
    							lcd.setText(calcPattern.format(op1));
    							clearText = true;
    
    							if(i==14) first = true; //equal button
    							else last0p = i; //save last operator
    						}//end else
    						break;
    					}//end of switch(i)
    				}//end of if
    			}//end of for
    		}//end of action performed
    
    		public static void main(String args[])
    		{
    			//set frame properties
    			Calculator f = new Calculator();
    			f.setTitle("Calculator Application");
    			f.setBounds(200,200,300,300);
    			f.setVisible(true);
    
    			//set image properties and add to frame
    			Image icon = Toolkit.getDefaultToolkit().getImage("calcImage.gif");
    			f.setIconImage(icon);
    		}
    
    }
    

    Nun bekomme ich folgenden Fehlermeldung, allerdings nicht beim kompilieren, sonder eher danach, wenn ich versuche das Programm zu starten.

    Exception in thread "main" java.lang.NullPointerException
            at java.awt.Container.addImpl(Container.java:1019)
            at java.awt.Container.add(Container.java:351)
            at Calculator.<init>(Calculator.java:112)
            at Calculator.main(Calculator.java:242)
    Press any key to continue . . .
    

    Kann mir da irgendjemand helfen?? Vielleicht bin ich auch nur blind und habe einen Fehler uebersehen 😕

    Danke schonmal

    Benedikt


  • Mod

    Das Element Nr. 15 in Deinem keys-Array ist null. Das versuchst Du da dem Panel hinzuzufügen. Anscheinend darfst Du dem Panel da nicht null hinzufügen.



  • danke fuer deine antwort, ich habe es auch versucht diesen button mal temporaer zu entfernen, allerdings funktioniert es einfach trotzdem nicht. vielen danke fuer deine hilfe trotzdem



  • Naja, soweit ich es sehe, wird keys[15] gar nicht initialisiert. Sehe nur, dass die indexe bis einschließlich 14 initialisiert sein (bis in Zeile 112). Initalisier mal keys[15]!



  • jup, das wars.
    vielen dank an euch !


Anmelden zum Antworten