2017-04-19 78 views
1

看起來,在拖放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 OS X的1.8.0_40 =>例外看到
  • Windows 7的1.8.0_40 =>沒有例外
  • Windows 7的1.8.0_121 =>無異常(最新的JDK在撰寫本文時)
+0

如果我運行它,並拖動到'目標',我看到在我的控制檯中有很多美麗的堆棧跟蹤.... –

+0

我使用JDK 1.8.0_121在Mac OS X上進行了測試。 –

+0

我剛剛在Ubuntu 16.04/1.8.0_40上試過......我得到了痕跡......看起來他們根源於不同的課程......「\t at com.sun.glass.ui.gtk.GtkApplication。 _runLoop(本機方法)「...必須是吞嚥Windows實施,但不是Linux/OS X ... – Adam

回答

0

看來,本機方法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.