Hello. Please review the fix for JDK 14. Bug: https://bugs.openjdk.java.net/browse/JDK-8229810 Fix: http://cr.openjdk.java.net/~serb/8229810/webrev.00
The root cause is a lack of synchronization in CGraphicsEnvironment, we create the GraphicsDevice under a special lock which is used to access the list of devices: http://hg.openjdk.java.net/jdk/client/file/39f133168348/src/java.desktop/macosx/classes/sun/awt/CGraphicsEnvironment.java#l184 but initialize the device w/o this lock. http://hg.openjdk.java.net/jdk/client/file/39f133168348/src/java.desktop/macosx/classes/sun/awt/CGraphicsEnvironment.java#l187 So it is possible that we create the device, add it to the list of devices, and before we initialize it the user could access the not fully initialized object. The bug exists from the jdk7, but it was hidden because all fields in CGraphicsDevice were primitives, so the app just used invalid data. In JDK-8211992 the object field "bounds" was added and now we can get NPE if this field was not initialized. As a fix, I suggest to always initialize the graphics device in the constructor. Note that we cannot move "displayChanged" which will notify devices and all listeners in awt/swing in the CGraphicsEnvironment under the lock, it will cause various deadlocks in the a different listeners. -- Best regards, Sergey.