2014/11/15

JRE/JDK 1.6/1.7/1.8で発生するWin32ShellFolder2.javaの不具合について

一部の環境で発生する、JavaVM(ランタイム)自体の未解決のバグがあり、JFileChooser初期化時にJVM内部で例外が発生する場合があります。

人工知能超解像プログラム NeuronDoublerではバッチモードでのファイルダイアログとしてJFileChooserを使用している為、不具合が発生する可能性があります。

情報提供して下さった方、ありがとう御座います。


以下、Javaランタイムの不具合と回避策を記載します。


環境:

 ・Windows版 JRE/JDK、1.6/1.7/1.8、32bit/64bit

 ・以下のレジストリキーを変更し、エクスプローラにネットワークを表示させないようにしている環境。

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
  {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}

  (参考リンク)ナビゲーションウィンドウやデスクトップ上の「ネットワーク」や「ライブラリ」を非表示にする方法は無いでしょうか?

  
原因:

 JFileChooserのコンストラクタを呼び出すと、カレントディレクトリがネットワーク上のフォルダかどうか判別する為、
 ネットワークフォルダのパスをネイティブライブラリから取得しようとするが、上記環境では見つからない為、Nullとなる。
 その際、sun.awt.shell.Win32ShellFolder2.getFileSystemPath()内部のNullトラップ漏れにより、例外(java.lang.NullPointerException)が発生する。


解決策:

 ・以下のレジストリキーを元に戻し、エクスプローラにネットワークを表示させるようにする。

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
  {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}