Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyClass.class.getClassLoader().getResource(";).getPath()引发NullPointerException_Java_Classloader - Fatal编程技术网

Java MyClass.class.getClassLoader().getResource(";).getPath()引发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.

我的代码在开发机器上正确运行,但在生产环境中安装时抛出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吗?

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启动器或任何具有某些安全限制的环境中执行该代码时)。我已经在我的开发机器上对此进行了多次测试,它会返回我的应用程序的根目录。这很容易测试。你可以在你的机器上试试。