编程语言
首页 > 编程语言> > JavaFX默默地吞下拖动侦听器中引发的异常

JavaFX默默地吞下拖动侦听器中引发的异常

作者:互联网

看起来,在JavaFX中,将异常拖入侦听器时会默默地吞下异常.我已经搜索过,在文档中找不到任何提及.

我在下面重新创建了这个…

无论如何有防止这种情况并暴露异常的方法吗?

public class App extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button source = new Button("source");
        Button destination = new Button("destination");
        HBox box = new HBox(source, destination);

        source.setOnDragDetected(event -> {
            Dragboard db = source.startDragAndDrop(TransferMode.ANY);
            ClipboardContent content = new ClipboardContent();
            content.putString("foo");
            db.setContent(content);
            event.consume();
        });
        destination.setOnDragOver(new EventHandler<DragEvent>() {
            public void handle(DragEvent event) {
                event.acceptTransferModes(TransferMode.LINK);
                String nullReference = null; 
                nullReference.toCharArray(); // cause an exception
                event.consume();
            }
        });
        primaryStage.setScene(new Scene(box));
        primaryStage.show();
    }

}

根据James_D的反馈意见和进一步调查,我们发现具体情况因平台而异

> Ubuntu Linux. 1.8.0_40 =>看到异常
> Mac OSX.1.8.0_40 =>看到异常
> Windows7.1.8.0_40 =>没有例外
> Windows 7 1.8.0_121 =>无例外(撰写本文时为最新JDK)

解决方法:

似乎本机方法WinDnDClipboard.push(Object [],int)-由GlassClipboard.cpp支持,可以静默吞下该异常.在调试器中可以看到对Throwable.getMessage()的调用,但没有异常输出到控制台.

该文件的Java 9版本(http://hg.openjdk.java.net/openjfx/9-dev/rt/file/1a3f128518cd/modules/javafx.graphics/src/main/native-glass/win/GlassClipboard.cpp)对CheckAndClearException(env)进行了额外的调用.就像Utils.cpp中定义的一样,但这是针对RT-35400的,后者似乎无关.尚未将其反向移植到Java 8.

标签:java,javafx,javafx-8
来源: https://codeday.me/bug/20191009/1878650.html