java.lang.NullPointerException的问题与解决

再看java的书,照着里面的一个实例编写代码,功能是点击不同的按钮可以修改窗体左上角的图标。

但是运行代码显示错误java.lang.NullPointerException。发了提问,有人回答说是图片设置的路径有问题,我自己也做了测试,路径确实是null。

我上网查了下,自己瞎改了改,最后程序可以正常运行了。

下面是代码和我的一些想法。注释部分就是原代码,被我修改和测试的部分,大家主要看那一块就好了。



package thirdthChapter;


import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;
//import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.UIManager;

public class FrameIcon extends JFrame {
    
    /**
     * 
     */
    private static final long serialVersionUID = 317032021100672658L;
    private JPanel contentPane;
    private JButton button1;
    private JButton button2;
    private JButton button3;
    private JButton button4;
    //private BackgroundPanel backgroundPanel;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager
                    .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run(){
                try {
                	//System.out.println("@@@@@@@@@");
                    FrameIcon frame = new FrameIcon();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the frame.
     */
    public  FrameIcon() {
        setResizable(false);
        setTitle("\u6307\u5B9A\u7A97\u4F53\u6807\u9898\u680F\u56FE\u6807");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 535, 348);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        
        System.out.println("##########");
        BackgroundPanel backgroundPanel = new BackgroundPanel();
        
        //URL resource = this.getClass().getResource("image/background.jpg");这一句就是导致无指针的罪魁
        //System.out.println(resource);测试上一句有无指针的,结果返回时null。后来被我注释掉
        Image image = (new ImageIcon("image/background.jpg")).getImage();//这一句本来是new ImageIcon(resource),就是上面被注释掉的resource,只这一句就可以
<span style="white-space:pre">	</span>//获得图片信息了,不知道为什么要两句代码,而且会出错了~ _ ~!
        System.out.println("xxxxxxxx");
        backgroundPanel.setImage(image);
        contentPane.add(backgroundPanel, BorderLayout.CENTER);
        
        JPanel panel = new JPanel();
        panel.setOpaque(false);
        panel.setBounds(45, 212, 447, 54);
        backgroundPanel.add(panel);
        
        button1 = new JButton("\u56FE\u68071");
        button1.setIcon(new ImageIcon("image/icon1.png"));
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        panel.add(button1);
        
        button2 = new JButton("\u56FE\u68072");
        panel.add(button2);
        button2.setIcon(new ImageIcon("image/icon2.png"));
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        
        button3 = new JButton("\u56FE\u68073");
        panel.add(button3);
        button3.setIcon(new ImageIcon("image/icon3.png"));
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        
        button4 = new JButton("\u56FE\u68074");
        panel.add(button4);
        button4.setIcon(new ImageIcon("image/icon4.png"));
        button4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
    }
    
    protected void do_button_actionPerformed(ActionEvent e) {
        String resource = "";// 定义图标文件名称变量
        //Image image = null;
        if (e.getSource() == button1)
            resource = "image/icon1.png";// 确定按钮对应的图标文件
        if (e.getSource() == button2)
        	resource = "image/icon2.png";
        if (e.getSource() == button3)
        	resource = "image/icon3.png";
        if (e.getSource() == button4)
            resource = "image/icon4.png";
        
        //System.out.println("fffffffffffff");测试用
        //System.out.println(resource);
        //backgroundPanel.setImage(image);
        //Image image = (new ImageIcon(resource)).getImage();
       // backgroundPanel.setImage(image);
        //URL url = this.getClass().getResource(resource);// 获取图标文件路径(这句话不知道干什么用的,但是确实是导致程序跑不通的原因)
        setIconImage(Toolkit.getDefaultToolkit().getImage(resource));// 设置窗体的图标
    }
}



整体来讲,问题就出在URL那一句,我不知道问题的原因出在哪,但是我改的一句代码就可以完成想要的效果了,不知道书上的代码是怎么想的





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值