NullPointerException в JxBrowser при передаче null из JavaScript в Java

Следующий код вызывает исключение NullPointerException в java-коде JxBrowser (версия 6.14), который я больше не могу отлаживать при передаче null в качестве аргумента java-методу.

В документации сказано, что null преобразуется в null, поэтому я предполагаю, что это должно работать, и это ошибка: https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript (таблица внизу)

Любые идеи, как это исправить?

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
  • Output (java):
    • msg: Ok!
    • log: ConsoleEvent{lineNumber=1, message='Uncaught java.lang.NullPointerException: null', source='about:blank'}

Используя точку прерывания исключения, я нашел эту трассировку стека:

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    

person Frederic Leitenberger    schedule 31.05.2017    source источник
comment
вы решили не проходить null?   -  person    schedule 31.05.2017
comment
"java.log(null);" // this fails with NullPointerException конечно... вы передаете ноль...   -  person evolutionxbox    schedule 31.05.2017
comment
Я хочу передать null моему java-объекту. NullPointerException должно происходить только при попытке сделать что-то вроде null.method(). Кроме того, в документации сказано, что null преобразуется в null, так что вроде поддерживается. Плюс еще раз: браузер JFX (который является альтернативой JxBrowser) поддерживает передачу null в java. Передача null в вызовах методов кода JS также не является проблемой. Я считаю, что это ошибка.   -  person Frederic Leitenberger    schedule 01.06.2017
comment
@JarrodRoberson Я пытаюсь заменить JFX Browser на JxBrowser. У нас есть много устаревшего и стороннего кода, который передает null таким образом во многих местах. Так что не пройти null не вариант. Единственным вариантом было бы избежать его и отключить на стороне java. Но это снова проблематично, поскольку один и тот же код JS также работает с другими реализациями хоста (Android и HTML), которым также нужен неэкранирующий код; или нам нужен переключатель, поэтому мы выходим только для хост-приложения JxBrowser.   -  person Frederic Leitenberger    schedule 01.06.2017
comment
Какую версию JxBrowser вы используете?   -  person G. Fiedler    schedule 01.06.2017
comment
@G.Fiedler Использование версии 6.14 (на данный момент самая новая)   -  person Frederic Leitenberger    schedule 01.06.2017
comment
Похоже, проблема в JxBrowser. Я сообщил об этой проблеме команде JxBrowser. Проблема будет исправлена ​​в одной из следующих версий. Тем временем я рекомендую вам избегать передачи null в качестве аргумента для внедренных методов объекта Java.   -  person Vladimir    schedule 16.06.2017


Ответы (2)


Эта проблема была исправлена ​​в сборке JxBrowser 6.19.2-b1-eap, доступной для скачать. Исправление будет включено в следующий официальный релиз.

person Vladimir    schedule 07.03.2018

Вы можете загрузить JxBrowser 6.20 с включенным исправлением.

person Natasha Dmitrieva    schedule 07.05.2018