3

問題の単純化されたバージョンは次のとおりです。

 SomeClass c = (SomeClass) obj.getSomeClassParent()

常にではありませんが、例外をトリガーすることがあります

 org.somepackage.SomeClass can't be cast to org.somepackage.SomeClass 

これはどのように可能ですか?JAI imageio がネイティブ lib であるという事実と関係があると思いますが、どのようにこれが起こるのでしょうか? 私はおそらく何かが欠けていますが、何ですか?

I'm using JAI imageio version 1.1 
dcm4che 2.0.21  DICOM lib

元のコードはこちら

  ImageInputStream iis = ImageIO.createImageInputStream(src);
  Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
  ImageReader reader = iter.next();
  DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();

そして元の例外

org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam can't be cast to    
org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam

例外画像 http://img215.imageshack.us/img215/3894/exception.jpg

4

4 に答える 4

8

なら起こり得ると思う

  1. SomeClassインスタンスは ClassLoader X からロードされました (したがって、そのクラスはCL SomeClassX のものであるか、それを呼び出しましょう: CL(X).SomeClass)
  2. しかし、別のクラスローダーでキャストされています。たとえば、現在の Threads クラス ローダーは Y なのでSomeClass、実際にはCL(Y).SomeClass

だからあなたは持っています:

  • インスタンス クラス =CL(X).SomeClass
  • クラス キャスト ターゲット =CL(Y).SomeClass

つまり、同じクラスではないため、クラスは例外をキャストします。


重複の可能性:同じクラスにキャストするときの ClassCastException - いくつかの良い提案もあります。

于 2010-01-08T18:30:37.657 に答える
2

クラスローダーとネイティブ ライブラリの不一致が原因で問題が発生していると思います。ネイティブ ライブラリがロードされ、クラスローダに関連付けられますが、プログラムは実際にはネイティブ ライブラリの 1 つのインスタンスしかロードできません。そのため、ネイティブ ライブラリをクラスローダー A にロードすると、それが出力するクラスはクラスローダー A に関連付けられます。後で同じネイティブ ライブラリをクラスローダー B にロードすると、実際には再度ロードされるわけではなく、そのままです。クラスローダー A のクラスを渡すため、Web アプリケーションを再デプロイしたか、同じネイティブ ライブラリを使用する同じ Web サーバーに 2 つの Web アプリケーションがあります。

可能であれば、ネイティブ ライブラリを Web サーバーの基本クラスパスに配置して、基本クラスローダーによって読み込まれるようにして、任意の Web アプリケーションで使用できるようにする必要があります。これを行うことができず、問題が再デプロイの問題のみである場合は、アンデプロイして再デプロイする前に少し待つことをお勧めします (理論的には、ネイティブ ライブラリは、関連付けられているクラスローダーが GC されるとアンロードされます。もちろん、これには不明な時間がかかる場合があります)。

于 2011-05-12T16:49:15.577 に答える
1

奇妙なことに、それを拡張するオブジェクトにキャストしようとしましたが、必要な機能があるかどうかはわかりませんが、それでも例外がスローされるかどうかを確認する価値があるかもしれません。

于 2010-01-08T18:31:28.327 に答える
1

画像から、Web アプリケーションのように見えることがわかります。「カタリナ」を読みました。そのため、純粋なクラスローディングの問題である可能性が高くなります。

たとえば、ImageIO クラスから取得した ImageReader が別のクラスローダによってロードされた場合 (おそらく別の Web アプリケーションにデプロイされているため)、getDefaultReadParam() メソッドによって返される DicomImageReadParam オブジェクトが - のインスタンスである場合に発生する可能性があります。技術的に話された - 別のクラス。

于 2010-01-08T19:36:53.390 に答える