eclipse 线程“main”中出现异常,无法调用“java.net.URL.toExternalForm()”,因为“位置”为空

jchrr9hc  于 2022-11-04  发布在  Eclipse
关注(0)|答案(1)|浏览(694)

不确定是什么问题。我有控制台错误,
第一个

xqnpmsa8

xqnpmsa81#

空指针异常并不难修复。大多数情况下,异常消息会告诉您问题所在。但此问题并非如此。不过,异常消息足以让您了解问题所在。
长话短说,抛出NullPointerException是因为您不知道如何在正确的上下文中使用getClass().getClassLoader().getResource()。对于您要尝试做的事情,您 * 可能 * 甚至不需要使用它。您可以简单地将一个更简单、有效的参数传递给ImageIcon构造函数。
让我们检查一下ImageIcon构造函数,看看您可以使用哪一个。

ImageIcon(); // Creates an uninitialized image icon.
ImageIcon(byte[]); // Creates an ImageIcon from an array of bytes which were read from an image file containing a supported image format, such as GIF, JPEG, or (as of 1.3) PNG.
ImageIcon(Image); // Creates an ImageIcon from an image object.
ImageIcon(String); // Creates an ImageIcon from the specified file. The String can be a file name or a file path.
ImageIcon(URL); // Creates an ImageIcon from the specified URL.

根据您在帖子中使用的参数,似乎您应该将文件名或文件路径直接传递到ImageIcon构造函数中,最坏的情况下,您可以传递图像的完整路径。
如果您的映像在项目中,获取完整路径的一种方法是使用System.getProperty("user.dir")。此属性返回启动Java应用程序的路径。这基本上是您的项目。这是一种很好的方法,因为此路径很可能会更改。例如,在开发期间,此路径可能会在团队中的开发人员之间更改。然后,当部署代码时,它很可能在一个不同的路径中。重要的是,在每种情况下,这个路径都将由系统自动为您解析。您也可以从项目的根目录传递一个相对路径,并且应该同样工作。
然后,您需要做的就是将项目根目录的相对路径附加到映像中。这样做,您的问题就解决了。
因此,假设您有一个“images”文件夹作为项目根目录的子文件夹,您需要替换以下行:

ImageIcon trippie = new ImageIcon(getClass().getClassLoader().getResource("trippie200x2001.png"));

就像这样:

ImageIcon trippie = new ImageIcon("./images/trippie200x2001.png");

或者是这样的:

ImageIcon trippie = new ImageIcon(System.getProperty("user.dir") + "/images/trippie200x2001.png");

使用您的代码和我自己的图像,我能够成功地启动您的应用程序

更新

在我的兴奋中,我忘记了回答这个问题的根本问题:如何使用getClass().getClassLoader().getResource()解决 location is“null” 问题?这很简单...当调用getResource()时,预期的行为是“resources”必须包含在项目的src路径中。任何不在类路径中的内容都不会被找到;因此有了NPE。
由于您传递的是“trippie200x2001.png”,因此该图像应该位于项目的src文件夹中。对于我的示例,由于我使用的是“images/trippie200x2001.png”,因此预期的行为是“images”是src中的一个包,并且所讨论的图像位于该包(文件夹)中。

相关问题