【问题标题】:Can't create a runnable jar with Intellij Idea [duplicate]无法使用 Intellij Idea 创建可运行的 jar [重复]
【发布时间】:2016-04-11 05:48:54
【问题描述】:

您好,我制作了两个程序:一个是关卡编辑器,另一个是马里奥克隆游戏。

我做了:项目结构-> 工件,我为这两个应用程序创建了一个 jar。

现在,如果我运行关卡编辑器的 jar,则没有任何问题。 如果我运行游戏的 jar,它不会启动并且我得到:

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1348)
    at com.platform.game.window.BufferedImageLoader.loadImage(BufferedImageLoader.java:15)
    at com.platform.selectlevel.LevelsFinder.<init>(LevelsFinder.java:60)
    at com.platform.game.window.Menu.<init>(Menu.java:72)
    at com.platform.game.window.Window.addMenu(Window.java:55)
    at com.platform.game.window.Window.<init>(Window.java:31)
    at com.platform.game.window.Game.main(Game.java:272)

如果我在编辑器中编译它运行良好,我该如何解决?有什么建议吗?

缓冲图像加载器:

public class BufferedImageLoader {

    private BufferedImage image = null;

    public BufferedImage loadImage(String path){

        try {
            image = ImageIO.read(getClass().getResourceAsStream(path));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
        return image;
    }
}

仅当我从 jar 而不是从 IDE 运行游戏时才出现异常,只是想知道为什么?有人知道吗?

【问题讨论】:

  • 加载图片的代码是什么?看起来由于某种原因无法找到/读取图像
  • 不看一些代码就不可能知道出了什么问题,但我会尝试检查图像路径或启动应用程序所需的任何配置/参数。调试第 15 行的 BufferedImageLoader 类也是一个好主意,以了解哪个输入作为 null 发送到 ImageIO。
  • IllegalArgumentException 不是一个检查异常(它扩展了RuntimeException),所以它编译的事实并不意味着它会工作。您将InputStream 传递给ImageIO.read(),即null,这意味着您可能忘记初始化它。
  • 事实是,如果我在编辑器中运行一切正常,如果我创建并运行 jar,我会遇到该错误,我会将 bufferedImageloader 代码放入问题中。

标签: java intellij-idea jar


【解决方案1】:

据我所知,问题不在于 jar 导出,而在于您的代码:

在您的方法BufferedImageLoader.loadImage(String path)(在文件BufferedImageLoader.java 的第15 行)中,您调用ImageIO.read(InputStream input)。然后将Class.getResourceAsStream(path) 返回的空对象传递给它,并作为docs for ImageIO.read(InputStream input) 状态:

抛出:IllegalArgumentException - 如果输入为空。

这会导致 IllegalArgumentException。我建议使用此代码:

public class BufferedImageLoader {

    private BufferedImage image = null;

    public BufferedImage loadImage(String path) {

        try {
            return image = ImageIO.read(BufferedImageLoader.class.getResourceAsStream(path));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

请参阅this post 了解更多信息。

【讨论】:

  • 只有当我为 jar 运行游戏时才会出现这些错误,如果我从编辑器编译并运行一切正常。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2014-05-26
  • 2018-03-22
  • 2014-07-26
相关资源
最近更新 更多