我正在eclipse中开发一个java项目。为了分发程序,我通过eclipse中的导出函数创建了一个可运行的.jar文件。
在我的程序中,加载存储在名为“tableImages”的文件夹中的多个图像。我通过类加载器加载图像(您将在下面找到代码片段)。问题如下:从.jar文件执行程序时,在加载上述文件夹中的.png文件之一时,它会抛出 NullPointerException。现在有趣的是,完全相同文件夹中的一些.png文件被正确加载,这意味着它们不会导致NullPointerException。
我使用jar tf命令检查了. jar的内容。显然无法加载的图像被打包到jar中。那么是什么导致了这个NullPointer异常,我该如何解决呢?
这是我在摇摆架上绘制图像的类。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;
public class LoadBackgroundImage extends Component {
private static final long serialVersionUID = 1L;
BufferedImage img;
public void paint(Graphics g){
g.drawImage(img, 0, 0, null);
}
public LoadBackgroundImage(String image){
URL url = ClassLoader.getSystemResource(image);
try{
img = ImageIO.read(url);
this.setSize(img.getWidth(), img.getHeight());
}catch(IOException e){
System.err.println(e.getMessage());
}
}
public Dimension getPreferredSize(){
if(img == null){
return new Dimension(100, 100);
}else{
return new Dimension(img.getWidth(null), img.getHeight(null));
}
}
public BufferedImage getImage(){
return img;
}
}
非常感谢您的帮助!
你可以使用一个URL,我自己刚刚试过了,效果很好,从jar中获取png文件:
下面是我使用的代码:
public static ImageIcon getIcon(String path)
{
String imageFile = "";
if(path.equals(""))
imageFile = "/Images/Icon.png";
else
imageFile = path;
URL source = Messages.class.getResource(imageFile);
if(source != null)
{
ImageIcon imageIcon = new ImageIcon(source);
return imageIcon;
}
return null;
}
然后我直接将其添加到 JLabel 中,像魅力一样工作,我还移动了 jar 文件并将图像文件重命名为 jar 之外,所以我确定。
假设文件确实在. jar包中,原因很可能是. jar文件中的条目以区分大小写的方式加载,因此foo.png
与Foo.png
不同。当您从常规文件加载时,行为取决于文件系统,因此在Windows和Mac上foo.png和Foo.png
将表示相同的文件(!)。
URL url = ClassLoader.getSystemResource(image);
此URL转换为文件系统中的绝对路径,这将是jar中文件的无效路径。例如,如果您有一个名为foo的文件。巴下的png。jar的URL将是/path_to_current_dir/bar.jar/!foo。png无效。相反,您可以将文件作为流读取:
InputStream is = getClass().getClassLoader().getResourceAsStream(image);
ImageIO.read(is);
我正在尝试从可执行JAR文件加载图像。 我跟踪了这里的信息,然后是这里的信息。 这是检索图像的函数: 这就是它的名称: 这是一个简单的对象。我也不会得到NullPointerException,除非它被UI屏蔽。 我检查了JAR文件,图像位于: /图片/标识1。巴布亚新几内亚 当前代码在eclipse中以及导出到JAR并在终端中运行时都有效,但在双击JAR时不起作用,在这种情况下,图标是默认的JF
我将StackPane作为根,并在主应用程序Start()方法中加载了BorderPane布局。在BorderPane布局中,我有两个按钮:一个用于添加fxml文件(Menu.fxml),另一个用于删除此文件。一旦菜单。fxml已加载,菜单中有一个按钮。fxml,单击时应在先前加载的BorderPane布局的中心加载一个fxml文件(One.fxml)。然而,在这个阶段,我得到了一个空指针异常。你
我正在尝试结合使用Struts2和Spring上传文件。但是,在到达action类之后,我的文件、和文件内容类型都显示为。我试图寻找问题,但没有结果。下面是我上传文件的代码。 : Struts.xml applicationContext-web.xml 管理上传动作 磁贴.xml Result.jsp
问题内容: 我目前正在编写一个程序,需要以jar形式发送给朋友。该程序具有需要加载的图像,以便程序正常运行,我希望所有图像都包含在一个jar中。目前,它无法从可执行jar或通过命令行运行时运行。它可以在netbeans中工作。 这是我正在使用的代码: 要加载我正在使用的图像: 对于我也尝试过的网址 应该在其中创建图像的行是: 我的jar文件设置为在其顶层包含类文件的文件夹和资源文件夹。 我一直在寻
我是Apache Camel的新手,正在尝试构建api。它有三个类。 A类-这是为了读取下面application.properties文件 B类-阿帕奇骆驼路线。 类C-Bean类,其中类A是自动连接的。 每当IDE执行api时,它都会在行中抛出Null指针异常。getUsername() 。我已经验证了spring boot能够加载应用程序。属性。 我不确定为什么调用自动加载类的方法会抛出空指
08-0712:11:44.453:I/Choreographer(1257):跳过126帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:46.313:I/Choreographer(1257):跳过了131帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:48.033:I/Choreographer(1257):跳过了33个帧! 应用程序可能在主线程上做了太多的