今天在练习代码时遇到了这个问题,百思不得其解,希望达人给予指点,代码如下:
import javax.swing.*;import java.awt.*;
import java.awt.event.*;
import java.io.*;public class NotePad{
public static void main(String args[]){
JFrame frame = new NotePadFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}class NotePadFrame extends JFrame{//fame中RAME的大小等设置.
public NotePadFrame(){
setSize(400,400);
Container c = this.getContentPane();
p = new NotePadPane();
menu = new NoteMenu();
menu.addMenuBar(fileMenu, "文件", this);
menu.addMenuBar(editMenu, "编辑", this);
menu.addMenuBar(formatMenu,"格式",this);
menu.addMenuItem(openItem,"编辑",fileMenu);
c.add(p);
}
public NotePadPane p;
public NoteMenu menu;
public static JMenu fileMenu,editMenu,formatMenu;
public static JMenuItem openItem,saveItem,closeItem;
}
/*
 * 在NoteMenu类中,需要定义一个static成员变量menubar.
 * 如果该变量放在addMenuBar()方法中声明,menu.addMenuBar方法只会产生一个菜单对象
 */
class NoteMenu extends JMenuBar{
public void addMenuBar(JMenu menuObj,final String MenuText,final JFrame frame){
NoteMenu.menuObj = menuObj;
frame.setJMenuBar(menuBar);
menuObj = new JMenu(MenuText);
menuBar.add(menuObj);
}
public void addMenuItem(JMenuItem itemObjName,final String s1,JMenu menuObjName){
itemObjName = new JMenuItem(s1);
menuObjName.add(itemObjName);
}
public static JMenu menuObj;
public static JMenuItem itemObj;
public static JMenuBar menuBar = new JMenuBar();
}
如上代码所示,出现问题的代码行已经用红色标识出来.当运行后eclipse报错如下:
Exception in thread "main" java.lang.NullPointerException
at notepad.NoteMenu.addMenuItem(NotePad.java:48)
at notepad.NotePadFrame.<init>(NotePad.java:26)
at notepad.NotePad.main(NotePad.java:11)
我无论怎么修改代码,总是提示这样的错误.我编程的基础不好,目前只能算是一个初学的爱好者,希望大家能给指点一下.

解决方案 »

  1.   

    找不到主类的错误,把主类找到了,再运行就可以了。在ECLIPSE 要配置主类
      

  2.   

    回复2楼:非常感谢你的回复,大使与主类没关系.错误的原因已经找到了.
    在标红的一句中menu.addMenuItem(openItem,"编辑",fileMenu); 
    这里的fileMenu没有被初始化,所以编译器虽然没有报错,但是在运行的时候就会报空指针的错误.解决的方式修改addMenuBar方法,让addMenuBar()返回一个JMenu的对象,然后在NotePadFrame类里定义个对象变量储存这个对象,这样代码运行就没问题了.
    现在我在考虑另一个问题,编写UI时,我这样写代码是否合适.我当初的目的是把添加菜单和菜单项的行为都写到addMenuBar和addMenuItem方法里,现在感觉这样做是给自己找麻烦,而且也看不到这样做的任何好处.
    欢迎继续讨论