2015-11-09 45 views
-1

圖片:。 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?還有別的嗎?請提前告知並提前致謝

+0

'this.getClass()getClassLoader()的getResourceAsStream()'不會返回一個NullPointerException()(它不能),但後來當您使用返回的InputStream時,您將體驗到NPE ... – wero

+0

您確定您傳遞給'getResourceAsStream'的路徑是否正確?你有沒有檢查'.jar'本身? – petrbel

+0

嘗試添加一個額外的「/」在它的前面 – 3kings

回答

0

在jar文件中通常沒有目錄。因此它將返回null。

如果你想要得到的文件,你可以直接獲得該資源:。

InputStream fileInputStream = getClass().getResourceAsStream(File.pathSeparator+className+".class"); 
+0

我需要包括我的包名嗎?例如。的getClass()的getResourceAsStream(File.pathSeparator + 「包」 + File.pathSeparato +的className + 「類」); –

+0

@ j.htan您正在使用的文件或資源必須可訪問。 – Doc

+0

我試過你的解決方案,它仍然無法正常工作。你確定它是File.pathSeparator而不是File.separator嗎?由於File.pathSeparator =「;」而File.separator =「\」 –

相關問題