圖片:。 This is my Project directoryjava的罐子的getClass()getClassLoader()的getResourceAsStream返回NullPointerException異常
在MainRun類,我有以下代碼:
package bin;
public class MainRun{
public static void main(String[] args){
compileCode("Square.java");
int length = 0;
MCAMClassLoader classLoader = new MCAMClassLoader();
Class<?> c= classLoader.findClass(bin.Square);
try{
Shape myClassObject = (Shape)c.newInstance();
Method method = c.getMethod(getLength);
Object result = method.invoke(myClassObject);
length = (int)result;
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(length);
}
public void compileCode(String _filename){
String[] args = new String[] {"-d", "C:\Users\Tan\Downloads\MCAM", "C:\Users\Tan\Downloads\MCAM\src\"+_filename};
com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
javac.compile(args);
}
}
在我定製的ClassLoader,我有以下代碼:
package bin;
public class MCAMClassLoader extends ClassLoader{
@Override
public Class<?> findClass(String name)
{
byte[] bt = loadClassData(name);
return defineClass(name, bt, 0, bt.length);
}
private byte[] loadClassData(String className) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(className.replace(".", "/")+".class"); //it will end up with bin/Square.class
ByteArrayOutputStream byteSt = new ByteArrayOutputStream();
int len =0;
try
{
while((len=is.read())!=-1)
{
byteSt.write(len);
}
} catch (IOException e) {
e.printStackTrace();
}
return byteSt.toByteArray();
}
}
而且我有我的Square類在運行時添加和編譯。 Square.class將位於bin文件夾中。
package bin;
public class Square extends Shape{
public Square(){
length = 8;
}
public int getLength(){
return length;
}
}
這些代碼在控制檯上通過.bat執行時工作得很好。只有當我將這些文件構建成jar文件並運行它時,我纔會在控制檯上看到錯誤:NullPointerException(while((len = is.read())!= - 1)「)。
注:在我的MANIFEST.MF
Manifest-Version: 1.0
Main-Class: bin.MainRun
Class-Path: .\lib\xmlbeans-2.6.0.jar .\lib\tools.jar
爲什麼?我是否正確使用ClassLoader?還有別的嗎?請提前告知並提前致謝
'this.getClass()getClassLoader()的getResourceAsStream()'不會返回一個NullPointerException()(它不能),但後來當您使用返回的InputStream時,您將體驗到NPE ... – wero
您確定您傳遞給'getResourceAsStream'的路徑是否正確?你有沒有檢查'.jar'本身? – petrbel
嘗試添加一個額外的「/」在它的前面 – 3kings