Java MyClass.class.getClassLoader().getResource(";).getPath()引发NullPointerException
我的代码在开发机器上正确运行,但在生产环境中安装时抛出NullPointerException。引发异常的行如下所示:Java MyClass.class.getClassLoader().getResource(";).getPath()引发NullPointerException,java,classloader,Java,Classloader,我的代码在开发机器上正确运行,但在生产环境中安装时抛出NullPointerException。引发异常的行如下所示: MyClass.class.getClassLoader().getResource("").getPath(); 因此,我将其拆分为多行代码,以查看哪个调用返回null,如下所示: ClassLoader cl = MyClass.class.getClassLoader(); URL url = cl.getResource(""); String path = url.
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吗?url是
null
,所以你不能在上面调用getPath()。用参数调用getResource
“
将始终返回null,因此这肯定会爆炸。getClassLoader
公共类加载器getClassLoader()
返回类的类装入器。一些实现可能使用null来表示引导类加载器。如果该类是由引导类装入器装入的,则在此类实现中,该方法将返回null
请阅读以上几行。javadocs中清楚地说明了该方法
返回:
用于读取资源的URL对象,如果
找不到资源或调用程序没有足够的资源
获取资源的权限
显然,没有名为“
的资源,因此返回null
对于不同的ClassLoader
实现,getResource
的实现是不同的
虽然这可能在本地机器上可靠地工作,但不能保证在其他类加载器实现上成功
因此,期望其他类加载器的行为有所不同(特别是如果您在应用程序服务器、WebStart启动器或任何具有某些安全限制的环境中执行该代码)。出于Javadoc中说明的原因,您需要放入getResource(“文件的绝对路径”)
。您不了解其中的哪一部分?您的代码正在执行预期的操作。如果搜索名为/path“”的资源,您希望得到什么?@Matthias和EJP在类加载器上调用getResource(“”)时,它返回java应用程序根目录的URL。至少这是我的开发机器目前的工作方式。@Zak好吧,那么这就是本地执行环境的类加载器正在做的事情。但是,这是特定于类加载器的。预期其他类加载器的行为会有所不同(特别是在应用程序服务器、WebStart启动器或任何具有某些安全限制的环境中执行该代码时)。我已经在我的开发机器上对此进行了多次测试,它会返回我的应用程序的根目录。这很容易测试。你可以在你的机器上试试。