0

我正在開發一個Django網站與Java小程序。Applet Java拋出異常與鉻

幾天前,該applet開始無法在我的Chrome瀏覽器中加載。我仍在開發中,我認爲這是一個緩存問題,所以測試我開始使用Firefox。

在今天,小程序開發的90%,並在Firefox上工作流暢。沒有問題。

所以我正在研究一些JS,並且我打開了Chrome(像它的調試器),所以我清理了Chrome的緩存文件夾和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是比傳遞給小程序。

小應用程序和頁面之間的通信由庫管理。

的JS加載的JSON:

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 *是一個整數r,我不明白這個奇怪的行爲。

編輯:

I交叉測試的JApplet的與Firefox和鉻,使用一些的println。 它出來,只有當我嘗試從Json提取一個int值時才顯示異常。 我成功提取了一個double和一個字符串。

在Firefox上,小程序仍在正常工作... 在鉻0成爲「0,000000」,4成爲「4,000000」。

加成

我解決迫使服務器整數轉換成字符串的問題。 但我不認爲這是正確的工作方式,這是一種解決方法。 所以,如果有人能拿出有效答案,我會分配點數。

+0

我發現試圖在同一時間通過多個參數時,這種行爲只存在。我在頁面中有一個JS調用一個只傳遞一個整數的JAVA方法,並且它沒有問題。 – 2013-03-07 01:27:29

回答

1

這不是一個完整的答案,但根據您收到的錯誤和我們正在加載網站http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=647706中詳述的類似問題,我認爲該問題與系統區域設置有關。系統語言環境與en_US有什麼不同?

對於原因,我還沒能理解,的Firefox運行Java時的語言環境不影響格式化方法,但在Chrome /鉻確實如此,這將導致它產生的語言環境格式化彩車(」 0,0「,而不是巴西的pt_BR語言環境中的」0.0「),那麼Java可能無法正確解析(推測使用獨立於語言環境的轉換)。

參見Problems using DecimalFormat