【问题标题】:MyClass.class.getClassLoader().getResource("").getPath() throws NullPointerExceptionMyClass.class.getClassLoader().getResource("").getPath() 抛出 NullPointerException
【发布时间】:2013-10-11 09:18:33
【问题描述】:

我的代码在开发机器上正常运行,但在生产环境中安装时抛出 NullPointerException。抛出异常的行如下:

MyClass.class.getClassLoader().getResource("").getPath();

所以我将其拆分为多行代码,以准确查看哪个调用返回 null,如下所示:

ClassLoader cl = MyClass.class.getClassLoader();
URL url = cl.getResource("");
String path = url.getPath();

现在 url.getPath() 调用抛出 NullPointerException,这意味着 cl.getResource("") 返回 null。

谁能告诉我这个调用怎么会返回null?

【问题讨论】:

  • 你需要输入getResource("absolute path for file")?
  • 出于 Javadoc 中所述的原因。哪一部分你不明白?
  • 您的代码正在执行预期的操作。如果您正在搜索名称/路径为“”的资源,您希望得到什么?
  • @Matthias 和 EJP 在类加载器上调用 getResource("") 时,它返回 java 应用程序根目录的 URL。至少这是它目前在我的开发机器上的工作方式。
  • @Zak 那么这就是你本地执行环境的 ClassLoader 正在做的事情。然而,这特定于ClassLoader。预计其他 ClassLoader 的行为会有所不同(特别是如果您在 Application Server、WebStart Launcher 或任何具有某些安全限制的环境中执行该代码)。

标签: java classloader


【解决方案1】:

getResource 的实现对于不同的ClassLoader 实现是不同的。

虽然这可能在您的本地机器上可靠地工作,但不能保证在其他 ClassLoader 实现上成功。

因此,期望其他 ClassLoader 的行为有所不同(特别是如果您在应用程序服务器、WebStart 启动器或任何具有某些安全限制的环境中执行该代码)。

【讨论】:

    【解决方案2】:

    ClassLoader#getResource(String name) 方法的 javadocs 中有明确的说明。

    返回: 用于读取资源的 URL 对象,如果 找不到资源或调用者没有足够的资源 获取资源的权限。

    显然,没有名称为"" 的资源,因此返回null。;

    【讨论】:

    • 我已经在我的开发机器上测试了几次,它返回了我的应用程序的根目录。这很容易测试。你可以在你的机器上试一试。
    【解决方案3】:

    网址是null,所以你不能在上面调用getPath()。在我的理解中,使用"" 参数调用getResource总是返回null,所以这肯定会爆炸。

    【讨论】:

      【解决方案4】:

      getClassLoader 公共类加载器 getClassLoader() 返回类的类加载器。一些实现可能使用 null 来表示引导类加载器。如果此类由引导类加载器加载,则此方法将在此类实现中返回 null。

      阅读以上行。

      【讨论】:

        猜你喜欢
        • 2015-06-13
        • 1970-01-01
        • 2012-06-19
        • 2014-06-09
        • 2013-06-06
        • 2015-06-03
        • 1970-01-01
        • 2011-04-17
        • 2014-11-04
        相关资源
        最近更新 更多