先说功能,我写的程序里要从image目录里调用jpg图片,在项目中编译正常的程序打包成jar就不正常了,然后我在调用图片之前加了如下的语句
String icon = "image/test.jpg";
JButton item = new JButton("test");
item.setIcon(new ImageIcon(MainFrame.class.getResource(icon)));
然后程序在编译时报空指针异常,相关错误中就指这上面的最一后行,请问这是什么原因造成?我如果把最后一行写成
item.setIcon(new ImageIcon(icon));
就成编译通过,但这样行打包后是不能调用jar里的图片。

解决方案 »

  1.   

    MainFrame.getClass().getClassLoader().getResource(icon)看看
      

  2.   

    楼上的,MainFrame里没有getClass这个静态方法,而且改成this后报错信息是一样的
      

  3.   

    不好意思,应该这样写String icon = "image/test.jpg"; 
    JButton item = new JButton("test"); 
    item.setIcon(new ImageIcon(MainFrame.class.getClassLoader().getResource(icon)));
      

  4.   

    因为路径变了,用winrar打开jar文件,看看新的相对路径和原来的有什么变化
      

  5.   

    public URL getResource(String name)一个 URL 对象;如果找不到带有该名称的资源,则返回 null找不到文件,getResource返回null,导致 new ImageIcon(URL url)报空指针怀疑是文件名大小写的问题,确定你这里的文件名与实际的文件名的大小写完全一致。
      

  6.   

    另外,如果你的类在编译之后打包,是否有使用混淆器,如果混淆器修改了此类的包结构的话,也是会出错的,最好改用绝对的jar内路径,也就是以"/"开头的相对于jar根目录的路径名
      

  7.   

    为了便于研究,我又重写一个更简单的程序,程序源码如下
    import java.awt.*;
    import javax.swing.*;public class JarTest {
    public static JFrame frm = new JFrame();

    public static void main(String[] args)
    {
    JButton btn = new JButton("Test Button");
    String icon = "image/test.gif";
    // btn.setIcon(new ImageIcon(icon));
    btn.setIcon(new ImageIcon(JarTest.class.getClassLoader().getResource(icon)));
    frm.add(btn);
    frm.pack();
    frm.setVisible(true);
    }
    }其中注释掉的一句是可正常运行的,现在还没打包成JAR,只在项目中运行就遇到如下的报错语句
    Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(ImageIcon.java:187)
    at JarTest.main(JarTest.java:12)
    我检查过了,不存在文件名和目录名的大小写错误,还是请高手帮我看看是什么原因造成??
      

  8.   

    就是路径问题,打包的和普通的不一样的。你将classloadeer的路径打印出来。JarTest.class.getClassLoader().getResource("")或JarTest.class.getClassLoader().getResource("/) ,再转换到你的路径试一下。
      

  9.   

    MainFrame.getClass().getClassLoader().getResource(icon)   应该是路径问题 不过没有遇到过
      

  10.   

    String icon = "/image/test.gif";或者String icon = "./image/test.gif";
    试试
      

  11.   

    是否要把image这个目录放在src目录下?
      

  12.   

    如果选择getResource("/image/a.jpg") 
    应该把image文件夹放在bin下;而不是src下如果选择getResource("image/a.jpg") 
    应该把image文件夹放在a.class,而不是a.java下试试吧~qq:350703354