2017-05-31 1 views
0

Der folgende Code verursacht eine NullPointerException im JxBrowser (Version 6.14) Java-Code, die ich nicht weiter debuggen kann, wenn null als Argument an eine Java-Methode übergeben.NullPointerException in JxBrowser beim Übergeben von null von JavaScript nach Java

In der Dokumentation sagt, es null zu null konvertiert, so dass ich davon ausgehen, es sollte funktionieren und es ist ein Fehler: https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript (Tabelle unten)

Irgendwelche Ideen, wie zu „reparieren“ das?

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.BrowserPreferences; 
import com.teamdev.jxbrowser.chromium.JSObject; 
import com.teamdev.jxbrowser.chromium.LoggerProvider; 
import com.teamdev.jxbrowser.chromium.events.ConsoleEvent; 
import com.teamdev.jxbrowser.chromium.events.ConsoleListener; 
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; 
import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; 
import com.teamdev.jxbrowser.chromium.swing.BrowserView; 
import java.awt.BorderLayout; 
import java.util.logging.Level; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class SSCCE_JxBrowser { 

    public static void main(String[] args) { 
     LoggerProvider.setLevel(Level.INFO); // ALL 
     BrowserPreferences.setChromiumSwitches("--remote-debugging-port=9222"); 

     Browser browser = new Browser(); 
     BrowserView browserView = new BrowserView(browser); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(browserView, BorderLayout.CENTER); 
     frame.setSize(700, 500); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle("JxBrowser Test"); 
     frame.setVisible(true); 

     browser.addScriptContextListener(new ScriptContextListener() { 

      @Override 
      public void onScriptContextDestroyed(ScriptContextEvent event) {} 

      @Override 
      public void onScriptContextCreated(ScriptContextEvent event) { 
       JSObject window = event.getBrowser().executeJavaScriptAndReturnValue("window").asObject(); 
       window.setProperty("java", new JavaObject()); 
      } 

     }); 

     browser.addConsoleListener(new ConsoleListener() { 

      @Override 
      public void onMessage(ConsoleEvent event) { 
       System.out.println("log: " + event); 
      } 

     }); 

     browser.loadHTML("<html><head>" // 
       + "<script>" // 
       + "java.log('Ok!');" // this is OK 
       + "java.log(null);" // this fails with NullPointerException 
       + "</script>" // 
       + "<body>page loaded - <a href=\"" + browser.getRemoteDebuggingURL() + "\" target=_blank>debug</a>" 
       + "</body></html>"); 
    } 

    public static class JavaObject { 

     public void log(String msg) { 
      System.out.println("msg: " + msg); 
     } 

    } 

} 
  • Output (HTML):
    • Uncaught java.lang.NullPointerException: null
  • Ausgabe (Java):
    • msg: Ok!
    • log: ConsoleEvent{lineNumber=1, message='Uncaught java.lang.NullPointerException: null', source='about:blank'}

eine Ausnahme Haltepunkt verwenden ich diese stacktrace gefunden:

Thread [IPC Sync Events Thread] (Suspended (exception java.lang.NullPointerException)) 
    com.teamdev.jxbrowser.chromium.JSContext.a(com.teamdev.jxbrowser.chromium.JSContext, com.teamdev.jxbrowser.chromium.internal.ipc.message.OnInvokeJSJavaMessage) line: 2608 
    com.teamdev.jxbrowser.chromium.JSContext$a.onMessageReceived(com.teamdev.jxbrowser.chromium.internal.ipc.message.Message) line: 280 
    com.teamdev.jxbrowser.chromium.internal.ipc.p.a(com.teamdev.jxbrowser.chromium.internal.ipc.p, com.teamdev.jxbrowser.chromium.internal.ipc.message.Message) line: 1082 
    com.teamdev.jxbrowser.chromium.internal.ipc.q.run() line: 66  
    com.teamdev.jxbrowser.chromium.internal.q.run() line: 63  
    java.util.concurrent.Executors$RunnableAdapter<T>.call() line: 511 
    java.util.concurrent.FutureTask<V>.run() line: 266 
    java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) line: 1142  
    java.util.concurrent.ThreadPoolExecutor$Worker.run() line: 617 
    java.lang.Thread.run() line: 748  
+1

Haben Sie erwogen, 'null' nicht zu übergeben? –

+0

'" java.log (null); " // Das scheitert mit NullPointerException natürlich ... du übergibst null ... – evolutionxbox

+0

Ich möchte 'null' an mein Java-Objekt übergeben. 'NullPointerException' sollte nur auftreten, wenn versucht wird, etwas wie' null.method() 'zu tun. Außerdem heißt es in der Dokumentation, dass 'null' in' null' konvertiert wird, also scheint es unterstützt zu werden. Nochmals: Der JFX-Browser (der eine Alternative zu JxBrowser ist) unterstützt die Übergabe von 'null' an Java. Das Übergeben von "null" innerhalb von JS-Code-Methodenaufrufen ist ebenfalls kein Problem. Ich glaube, das ist ein Fehler. –

Antwort

0

Dieses Problem für download in JxBrowser 6.19.2-b1-eap Build verfügbar wurde behoben. Der Fix wird in der nächsten offiziellen Version enthalten sein.

Verwandte Themen