我写了这样一段代码,然后我在父窗口打开这个窗口时(窗口没显示),弹出来一个空指针异常,我不知道哪里错了,请各位高手看看(帖子内容过长,我把IMPORT部分和变量声明去掉了一些)
public class GameSet extends JInternalFrame{
    
        public GameSet(){        super();        setTitle("游戏设置");        Panel = new JPanel();
        
        basepicture = new JLabel("选择背景图片");
        basepicture.setFont(new Font("黑体", Font.PLAIN, 18));
        picture = new JLabel();
        picture1 = new JLabel();
        picture2 = new JLabel();
        p1 = new ImageIcon(getClass().getResource("/puke/背景11.jpg"));
        picture1.setIcon(p1);
        p2 = new ImageIcon(getClass().getResource("/puke/背景22.jpg"));
        picture2.setIcon(p2);
        picture = picture1;
        gamemode = new JLabel("游戏进行模式");
        gamemode.setFont(new Font("黑体", Font.PLAIN, 18));
        discard = new JLabel("已出牌选择");
        discard.setFont(new Font("黑体", Font.PLAIN, 18));
        gamelevel = new JLabel("游戏难度");
        gamelevel.setFont(new Font("黑体", Font.PLAIN, 18));        pic1 = new JRadioButton("清爽背景");
        pic2 = new JRadioButton("大红背景");
        bg1 = new ButtonGroup();
        ActionListener al = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {               
                if (ae.getSource() == pic1) {
                    picture = picture1;
                    piccount = 1;
                }
                else {
                    picture = picture2;
                    piccount = 2;
                }
            }
        };
        pic1.setSelected(true);
        pic1.addActionListener(al);
        pic2.addActionListener(al);
        bg1.add(pic1);
        bg2.add(pic2);
   
        bg2 = new ButtonGroup();
        landlord1 = new JRadioButton("赢家地主");
        landlord1.setHideActionText(true);
        landlord1.setToolTipText("地主赢的可以连庄,即继续做地主");
        landlord2 = new JRadioButton("随机地主");
        landlord2.setHideActionText(true);
        landlord2.setToolTipText("随机选择地主,就是叫分制");
        ActionListener al1 = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (ae.getSource() == landlord1) {
                  count1 = 10;
                }
                else {
                  count1 = 20;
                }
            }
        };
        landlord1.setSelected(true);
        landlord1.addActionListener(al1);
        landlord2.addActionListener(al1);
        bg2.add(landlord1);
        bg2.add(landlord2);
        threezone = new JCheckBox("可三带二");
        threezone.setHideActionText(true);
        threezone.setToolTipText("即三张同样的牌可以带对子");
        bomb = new JCheckBox("炸弹翻番");
        bomb.setHideActionText(true);
        bomb.setToolTipText("出现炸弹的该局底分翻倍,倍数=2的出现的炸弹数次方");
        bg3 = new ButtonGroup();
        ActionListener al2 = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (ae.getSource() == threezone||ae.getSource() == bomb) {
                  count2 = 1;
                }
                else if(ae.getSource() != threezone&&ae.getSource() != bomb){
                  count2 = 0;
                }               
                else {
                  count2 = 2;
                }
            }
        };
        count = count1+count2;
        threezone.addActionListener(al2);
        bomb.addActionListener(al2);
        threezone.setSelected(true);
        bomb.setSelected(true);
        bg3.add(threezone);
        bg3.add(bomb);
       
        show = new JRadioButton("正面显示");
        baseshow = new JRadioButton("背面显示");
        notshow = new JRadioButton("不显示");
        bg4 = new ButtonGroup();
        ActionListener al3 = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (ae.getSource() == show) {
                  discount = 1;
                }
                else if(ae.getSource() == baseshow){
                  discount = 2;
                }               
                else {
                  discount = 3;
                }
            }
        };
        show.addActionListener(al3);
        baseshow.addActionListener(al3);
        notshow.addActionListener(al3);
        notshow.setSelected(true);
        bg4.add(show);
        bg4.add(baseshow);
        bg4.add(notshow);
   
        low = new JRadioButton("低");
        middle = new JRadioButton("中");
        high = new JRadioButton("高");
        bg5 = new ButtonGroup();
        ActionListener al4 = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (ae.getSource() == low) {
                  levelcount = 1;
                }
                else if(ae.getSource() == middle){
                  levelcount = 2;
                }
                else {
                  levelcount = 3;
                }
            }
        };
        low.addActionListener(al4);
        middle.addActionListener(al4);
        high.addActionListener(al4);
        middle.setSelected(true);
        bg5.add(low);
        bg5.add(middle);
        bg5.add(high);
                savebutton = new JButton("保存");
        savebutton.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    try{
                        String strurl="jdbc:odbc:gamecardDatabase";
                        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                        Connection con1 = DriverManager.getConnection(strurl);
                        Statement  stm1 = con1.createStatement();
                        ResultSet  rs1  = stm1.executeQuery("select * from gameset");
                        DataConnect a = new DataConnect();
                        a.EditGameSet(1,rs1,stm1);
                        a.EditGameBase(piccount, rs1, stm1);
                        a.EditGameMode(count, rs1, stm1);
                        a.EditDiscard(discount, rs1, stm1);
                        a.EditGameLevel(levelcount, rs1, stm1);
                    }
                    catch(ClassNotFoundException a){
            a.printStackTrace();
            }
                    catch(SQLException h){
            h.printStackTrace();
            }
                }
            }
        );
        defaultbutton = new JButton("默认");
        defaultbutton.setToolTipText("恢复默认设置后请再点一下保存,然后就保存了设置。");
        defaultbutton.addActionListener
        (
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    pic1.setSelected(true);
                    pic2.setSelected(false);
                    landlord1.setSelected(true);
                    landlord2.setSelected(false);
                    threezone.setSelected(true);
                    bomb.setSelected(true);
                    show.setSelected(false);
                    baseshow.setSelected(false);
                    notshow.setSelected(true);
                    low.setSelected(false);
                    middle.setSelected(true);
                    high.setSelected(false);
                }
            }
        );
        exitbutton = new JButton("退出");
        exitbutton.addActionListener
        (
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    dispose();
                }
            }
        );             
        Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
        下面省略了一部分是用Panel把所有组件ADD进去。
                this.getContentPane().add(Panel);
validate();
        setClosable(true);
        setIconifiable(true);        setBounds(10,10,300,400);
        setVisible(true);
        
    }
    
}

解决方案 »

  1.   

    有可能是ButtonGroup的问题,我加了之后就出现异常了,加之前都能显示的
      

  2.   

            bg2.add(pic2); 
      
            bg2 = new ButtonGroup(); 还没实例化就使用,能不空指针吗?
      

  3.   

    我也遇上过。空指针异常一般都是在你引用变量的时候还没有初始化(new),所以你可以根据错误的行发现未初始化的变量,将其new或者初始化一下就ok了。
      

  4.   

            pic1 = new JRadioButton("清爽背景"); 
            pic2 = new JRadioButton("大红背景"); 
            bg1 = new ButtonGroup(); 
            ActionListener al = new ActionListener() { 
                public void actionPerformed(ActionEvent ae) {              
                    if (ae.getSource() == pic1) { 
                        picture = picture1; 
                        piccount = 1; 
                    } 
                    else { 
                        picture = picture2; 
                        piccount = 2; 
                    } 
                } 
            }; 
            pic1.setSelected(true); 
            pic1.addActionListener(al); 
            pic2.addActionListener(al); 
            bg1.add(pic1); 
            bg2.add(pic2); 这里的bg2.add(pic2);应该改为bg1.add(pic2);