eclipse中添加图片URL,提示空指针

以下是学习过程中,书上的实例代码,博主对着敲了一遍却无法运行。

import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class SwingAndThread extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel jl = new JLabel(); // 声明JLabel对象
	private static Thread t; // 声明线程对象
	private int count = 0; // 声明计数变量
	private Container container = getContentPane(); // 声明容器
	
	public SwingAndThread() {
		setBounds(300, 200, 250, 100); // 绝对定位窗体大小与位置
		container.setLayout(null); // 使窗体不使用任何布局管理器
		URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL
		Icon icon = new ImageIcon(url); // 实例化一个Icon
		jl.setIcon(icon); // 将图标放置在标签中
		 // 设置图片在标签的最左方
		jl.setHorizontalAlignment(SwingConstants.LEFT);
		jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小
		jl.setOpaque(true);
		t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口
					public void run() { // 重写run()方法
						while (count <= 200) { // 设置循环条件
							 // 将标签的横坐标用变量表示
							jl.setBounds(count, 10, 200, 50);
							try {
								Thread.sleep(1000); // 使线程休眠1000毫秒
							} catch (Exception e) {
								e.printStackTrace();
							}
							count += 4; // 使横坐标每次增加4
							if (count == 200) {
								// 当图标到达标签的最右边,使其回到标签最左边
								count = 10;
							}
						}
					}
				});
		t.start(); // 启动线程
		container.add(jl); // 将标签添加到容器中
		setVisible(true); // 使窗体可视
		// 设置窗体的关闭方式
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new SwingAndThread(); // 实例化一个SwingAndThread对象
	}
}


报错信息如下:

Exception in thread "main" java.lang.NullPointerException
	at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:217)
	at SwingAndThread.<init>(SwingAndThread.java:19)
	at SwingAndThread.main(SwingAndThread.java:51)

但是却可以通过命令行成功运行:


原因在于:

URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL


观察项目文件夹的目录如上图,有一个src目录,这是JAVA源文件的目录,有一个bin目录,这是JAVA编译后文件(.class文件等)的存放目录。

解决方案如下图 :


即在bin文件夹中添加该图片文件。

你想添加图片的URL,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言。

 所以当我们想要使用getResource()方法时,就只好把文件放在.class文件相同目录下或者它的父目录中了。

或者,直接用绝对路径,不用getResource()方法,但是使用绝对路径,有违java一次编译,处处运行的精神



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值