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
Haben Sie erwogen, 'null' nicht zu übergeben? –
'" java.log (null); " // Das scheitert mit NullPointerException natürlich ... du übergibst null ... – evolutionxbox
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. –