62,629
社区成员
发帖
与我相关
我的任务
分享Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1095)
at java.awt.Container.add(Container.java:419)
at javax.swing.JPopupMenu.add(JPopupMenu.java:291)
at javax.swing.JMenu.add(JMenu.java:574)
at com.hucpu.frame.MainFrame.<init>(MainFrame.java:34)
at com.hucpu.frame.MainFrame.main(MainFrame.java:9)
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame{
private static final JMenuItem polntExchangeItem = null;
public static void main(String[] args) {
new MainFrame();
}
private JMenuItem polintExchangeItem;
private MainFrame(){
this.setTitle("酒店管理系统");
this.setSize(500,350);
this.setLocation(150,150);//设置品行时该出口福示的位用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());//将框架frame设置为流布局
this.setVisible(true);
userMenu.add(regItem);
userMenu.add(loginItem);
userMenu.add(logoutItem);
//将会员管理主菜单添加到菜单栏框中
bar.add(userMenu);
//将菜单栏对象添加到主框架窗口中
this.setJMenuBar(bar);
accountMenu.add(queryMoneyItem);
accountMenu.add(saveMoneyItem);
accountMenu.add(consumeItem);
//将会员消费菜单添加到菜单项
bar.add(pointMenu);
//为会员消费菜单添加菜单项
pointMenu.add(queryPointItem);
pointMenu.add(polintExchangeItem);
//将会员消费菜单添加到菜单栏中
bar.add(pointMenu);
}
JMenuBar bar= new JMenuBar();//为框架添加菜单栏
JMenu userMenu= new JMenu("会员管理");//添加‘会员管理’主菜单
//为会员管理主需单添加注册、登录、注销三个一级菜单项
JMenuItem regItem = new JMenuItem("注册");
JMenuItem loginItem = new JMenuItem("登录");
JMenuItem logoutItem = new JMenuItem("注销");
//将注册、登量、注销三个某单项违加到会员管理主采单中
JMenu accountMenu = new JMenu("会员消费管理");//会员消费管理菜单
JMenuItem saveMoneyItem = new JMenuItem("会员充值");//充值菜单项
JMenuItem queryMoneyItem = new JMenuItem("查询余额");//查询余额菜单项
JMenuItem consumeItem = new JMenuItem("会员消费");//会员消费菜单项
JMenu pointMenu = new JMenu("会员积分管理");//会员积分管理菜单
JMenuItem queryPointItem = new JMenuItem("查询积分");//查询积分菜单项
JMenuItem pointExchangeItem = new JMenuItem("积分兑换");//会员兑换菜单项
}
你的代码中存在一些问题,导致了 NullPointerException。以下是问题的详细分析和解决方案:
问题分析
polintExchangeItem 未初始化:
你在类的字段中声明了 private JMenuItem polintExchangeItem;,但在构造函数中使用的是 polintExchangeItem 而非 pointExchangeItem,并且未对其进行初始化。
类字段的声明和初始化顺序混乱:
你将大部分的菜单项和菜单的声明放在了类字段部分,而在构造函数中尝试添加这些未初始化的菜单项,这导致了 NullPointerException。
解决方案
确保所有的菜单项在使用之前都已经被正确初始化。
修正拼写错误,并确保代码的逻辑顺序正确。
以下是修正后的代码:
import javax.swing.;
import java.awt.;
public class MainFrame extends JFrame {
public static void main(String[] args) {
new MainFrame();
}
private JMenuBar bar = new JMenuBar();// 为框架添加菜单栏
private JMenu userMenu = new JMenu("会员管理");// 添加‘会员管理’主菜单
private JMenu accountMenu = new JMenu("会员消费管理");// 会员消费管理菜单
private JMenu pointMenu = new JMenu("会员积分管理");// 会员积分管理菜单
// 为会员管理主菜单添加注册、登录、注销三个一级菜单项
private JMenuItem regItem = new JMenuItem("注册");
private JMenuItem loginItem = new JMenuItem("登录");
private JMenuItem logoutItem = new JMenuItem("注销");
// 会员消费管理菜单项
private JMenuItem queryMoneyItem = new JMenuItem("查询余额");
private JMenuItem saveMoneyItem = new JMenuItem("会员充值");
private JMenuItem consumeItem = new JMenuItem("会员消费");
// 会员积分管理菜单项
private JMenuItem queryPointItem = new JMenuItem("查询积分");
private JMenuItem pointExchangeItem = new JMenuItem("积分兑换");
private MainFrame() {
this.setTitle("酒店管理系统");
this.setSize(500, 350);
this.setLocation(150, 150);// 设置窗口显示的位置
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());// 将框架frame设置为流布局
// 将会员管理主菜单添加到菜单栏框中
userMenu.add(regItem);
userMenu.add(loginItem);
userMenu.add(logoutItem);
bar.add(userMenu);
// 将会员消费管理菜单添加到菜单栏中
accountMenu.add(queryMoneyItem);
accountMenu.add(saveMoneyItem);
accountMenu.add(consumeItem);
bar.add(accountMenu);
// 为会员消费菜单添加菜单项
pointMenu.add(queryPointItem);
pointMenu.add(pointExchangeItem);
// 将会员积分管理菜单添加到菜单栏中
bar.add(pointMenu);
// 将菜单栏对象添加到主框架窗口中
this.setJMenuBar(bar);
this.setVisible(true);
}
}
说明
初始化顺序:在类字段部分初始化所有的菜单和菜单项,然后在构造函数中按照逻辑顺序添加这些菜单项。
拼写错误:修正了 polintExchangeItem 为 pointExchangeItem。
通过这种方式,确保所有的菜单项在被添加到菜单之前都已经正确初始化,从而避免了 NullPointerException。
我很同意,话说发15个字的评论能获得积分,我也试一试
public class MainFrame extends JFrame {
// 删除静态的 polntExchangeItem 变量
// ... 省略其他代码 ...
private MainFrame() {
// ... 省略其他代码 ...
// 将会员消费菜单添加到菜单项
pointMenu.add(queryPointItem);
// 使用正确的变量名 polintExchangeItem(注意拼写)
pointMenu.add(polintExchangeItem); // 确保在这里之前已经初始化了 polintExchangeItem
// ... 省略其他代码 ...
}
// ... 省略其他代码 ...
// 声明 polintExchangeItem 变量(注意拼写)
private JMenuItem polintExchangeItem = new JMenuItem("积分兑换"); // 初始化 polintExchangeItem
// ... 省略其他代码 ...
}
帮你修改了一下你自己改改
polintExchangeItem 没有赋值导致空指针