0

アプレット Java を使用して Django サイトを開発しています。

数日前、Chrome ブラウザでアプレットの読み込みに失敗し始めました。私はまだ開発中で、これはキャッシュの問題だと思ったので、テストのために firefox を使い始めました。

現在、アプレットは 90% で開発されており、Firefox ではスムーズに動作します。まったく問題ありません。

それで、私はいくつかのJSに取り組んでいて、クロム(デバッガーなど)を開いたので、クロムのキャッシュフォルダーとJavaプラグインキャッシュを消去し、サイトを開きました。

アプレットを読み込めませんでした。エラーは次のとおりです。

 java.lang.reflect.InvocationTargetException
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
     at sun.applet.PluginAppletSecurityContext$5.run(PluginAppletSecurityContext.java:943)
     at java.security.AccessController.doPrivileged(Native Method)
     at sun.applet.PluginAppletSecurityContext.handleMessage(PluginAppletSecurityContext.java:940)
     at sun.applet.AppletSecurityContextManager.handleMessage(AppletSecurityContextManager.java:70)
     at sun.applet.PluginStreamHandler.handleMessage(PluginStreamHandler.java:235)
     at sun.applet.PluginMessageHandlerWorker.run(PluginMessageHandlerWorker.java:78)
 Caused by: java.lang.NumberFormatException: For input string: "0,000000"
     at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
     at java.lang.Double.valueOf(Double.java:504)
     at java.lang.Double.<init>(Double.java:597)
     ... 10 more
 java.lang.NullPointerException
     at sun.applet.PluginAppletViewer.getMember(PluginAppletViewer.java:1020)
     at netscape.javascript.JSObject.getMember(JSObject.java:155)
     at objects.CommunicationWithJS.parseFloors(CommunicationWithJS.java:75)
     at main.MapGenerator.start(MapGenerator.java:27)
     at sun.applet.AppletPanel.run(AppletPanel.java:476)
     at java.lang.Thread.run(Thread.java:722)

奇妙なことに、Firefox では問題なく動作します...

読み込み時に、アプレットはページ上の JS を呼び出してサイトから Json を読み込みます。この Json はアプレットに渡されます。

アプレットとページ間の通信は、netscapeライブラリによって管理されます。

JSON をロードする JS:

    function getFloors() {
            var xmlHttp = null;

            xmlHttp = new XMLHttpRequest();
            xmlHttp.open( "GET", GET_FLOORS, false );
            xmlHttp.send(null);
            var json = JSON.parse(xmlHttp.responseText);

            return json;
    }

そして、アプレットのコード:

public Floor[] parseFloors(URL codebase) {

    JSObject jsonFloors = (JSObject) window.eval(GET_FLOORS);

            // counter of the number of objects
    int i=0;
    for (; i < 50; i++) 
        try {
            if (jsonFloors.getSlot(i) == null)
                break;
        } catch (JSException jse) {
            break;
        }

    Floor[] floors = new Floor[i];

    for (int t=0; t < i; t++) {

        JSObject jsonFloor = (JSObject) jsonFloors.getSlot(t);
        try {
            int numero_di_piano = Integer.parseInt(jsonFloor.getMember(NUMERO_DI_PIANO)+"");
            URL link = new URL(codebase, jsonFloor.getMember(LINK).toString());
            float bearing = Float.parseFloat(jsonFloor.getMember(BEARING).toString());
            int id = Integer.parseInt(jsonFloor.getMember(ID).toString());

            Floor floor = new Floor(numero_di_piano, link, bearing, id);
            floors[t] = floor;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }   
    }
    return floors;
}

エラーCommunicationWithJS.java:75

   int numero_di_piano = Integer.parseInt(jsonFloor.getMember(NUMERO_DI_PIANO)+"");

サーバーから返される *NUMERO_DI_PIANO* の値は整数です。この奇妙な動作がわかりません。

編集:

printlnを使用して、ジャプレットを firefox と chrome でクロステストしました。Json からint値を抽出しようとした場合にのみ、例外が表示されることがわかりました。double と string の抽出に成功しました。

Firefox ではアプレットはまだ動作しています... chrome では 0 は "0,000000" になり、4 は "4,000000" になります。

添加

サーバーに整数を文字列に変換させるという問題を解決しました。しかし、それが正しい方法だとは思いません。回避策です。それで、誰かが有効な答えを出すことができれば、私はポイントを割り当てます.

4

1 に答える 1

1

これは完全な回答ではありませんが、発生しているエラーと、 http://bugs.debian.org/cgi-bin/bugreport.cgi? bug=647706に詳述されている Web サイトの読み込み中に発生している同様の問題に基づいています。この問題はシステム ロケールに関連していると思います。システム ロケールは en_US とは異なるものですか?

私がまだ理解できていない理由で、Firefox 内で Java を実行する場合、ロケールは書式設定方法に影響しませんが、Chrome/Chromium では影響し、ロケール形式の浮動小数点 ("0,0") が生成されます。たとえば、ブラジルの pt_BR ロケールの "0.0" の代わりに) Java は適切に解析できません (おそらくロケールに依存しない変換を使用します)。

DecimalFormat の使用に関する問題も参照してください。

于 2013-06-08T00:05:06.690 に答える