2012-04-12 6 views
1

カスタムMinecraftランチャーで使用しているメモリクラスローダー(here)があります。Java MemoryClassLoader(IllegalArgumentException)


27 achievements 
182 recipes 
Setting user 
LWJGL Version: 2.4.2 
java.lang.IllegalArgumentException: input == null! 
at javax.imageio.ImageIO.read(Unknown Source) 
at lc.<init>(SourceFile:21) 
at gi.<init>(SourceFile:10) 
at net.minecraft.client.Minecraft.a(SourceFile:254) 
at net.minecraft.client.Minecraft.run(SourceFile:657) 
at java.lang.Thread.run(Unknown Source) 

は、私はこのようなクラスローダを作成しています:私はMinecraftの(JavaのLWJGLゲーム)、私は次のエラーを取得していますをロードするたびに

Memory Class Loader

Base.cLoader = new CLoader(
    GameUpdater.classLoader, 
    new JarInputStream(new ByteArrayInputStream(jarFileBytes))); 

ご覧のとおり、LWJの後に突然最初の部分をロードすることができますGLバージョンでは、 "input == null"でクラッシュします。

編集 - ここに新しいgetResourceメソッドがあります。
エラーは「URL()」に表示されています。

Image

コード:警告:このため URLはまだ実装されていない

public URL getResource(final String name) { 
    URL url = new URL() { public InputStream openStream() { 
     return new ByteArrayInputStream((byte[])others.get(name)); 
    }}; 

    return url; 
} 

答えて

2

野生の推測...それは、このことができます! getResource()またはgetResources()を呼び出すことはできません!

コードでは、実装されていないメソッドを使用してJARからイメージを取得することを想定しています。これと同等のはおそらく実行されている:私たちが見てきたように、その除き

ImageIO.read(memClassLoader.getResource(someString)); 

を、getResourceからスローされるエラーは無視なっているとnullを値として使用されています。 ImageIO.readは次のようになります。

public static BufferedImage read(URL input) throws IOException { 
    if (input == null) { 
     throw new IllegalArgumentException("input == null!"); 
    } 

    InputStream istream = null; 
    try { 
     istream = input.openStream(); 
    } catch (IOException e) { 
     throw new IIOException("Can't get input stream from URL!", e); 
    } 
} 

よく知られていますか?これはおおよそ実装する必要があります:

public URL getResource(final String name) { 
    try { 
    return new URL("", "", 0, "", 
     new URLStreamHandler() { public URLConnection openConnection(URL url) { 
      return new URLConnection(url) { 
      public void connect() {} 
      public InputStream getInputStream() { 
       // return the appropriate InputStream, based on the name arg 
      } 
      }; 
     }}); 
    } catch (MalformedURLException e) { throw new RuntimeException(e); } 
} 
+0

私はカスタム "getResource"メソッドを追加しようとします...あなたはまさに正しいかもしれません!ハハ。 –

+0

私は実際のgetResource()メソッドの作成に問題があります。どこから起動するのか分かりません。何か案は? –

+0

答えを編集しました。 –

0

MemoryClassLoaderはかなり壊れています。 getResource()を実装していません(ソースのコメントに記載されています)。また、ロードするクラスのパッケージを定義しません(アプリケーションを破損する場合もありません)。

ほとんどの場合、ClassLoaderはテスト目的ですぐにハッキングされ、より複雑なメソッドが残されていました。

getResource()を処理する独自のURLプロトコルを実装することはあまり難しくありません。getResource()ではカスタムプロトコル名(「myclassloader:// resourcename」など)を使用するURLを返します。そのプロトコルを処理するURLStreamHandler ClassLoaderを介してロードされたコードがURL.toString()を使用し、それを元に戻した場合、リソースの検索に問題を引き起こす可能性のあるすべての抜け穴をカバーできない可能性があります。

既存のClassLoaderへの単純な委譲ではない、完全に機能するClassLoaderを実装することは、ほとんどの例が見ているように単純ではありません。

+0

興味深い、これを行う例はありますか?私はClassLoaderシーンを全く新しいです。私は実際にMemoryClassLoaderを動作させたいと思っていますが、それが難しいのであれば、正常に読み込む必要があります。 :/ –

+0

私は完全に動作している例はわかりません - 私は自分自身のClassLoaderをハックしました。テスト中にgetResource()に行き、 "定義されているパッケージがありません"という問題が発生しました。どちらも実行する必要があったアプリケーションを壊しました。 – Durandal

関連する問題