I have problems with converting a base64 String into a JavaFX Image. The methode prepareAvatar gets a String that is either a direct url to a image on imgur or a base64 String. The image is being put into a Circle and returned. Handling the images from imgur works correctly. When I try to convert the base64 String into a image I get this weird exception in the JavaFX Application Thread. I'm not sure how to handle it since the stacktrace doesn't show which particular line of my code causes the error. I just don't understand how 'image' can even be null since I initialize it immediatly with the default avatar.
public Circle prepareAvatar(String avatar) {
Image image = new Image(Objects.requireNonNull(App.class.getResourceAsStream(Constants.DEFAULT_AVATAR)));
if (!(avatar == null) && !(avatar.equals("data:image/png;base64,null")) && (avatar.contains("jpeg") || avatar.contains("gif") || avatar.contains("png") || avatar.contains("bmp"))) {
if (avatar.startsWith("http")) {
image = new Image(avatar);
} else {
String base64 = avatar.split(",")[1];
//System.out.println(avatar);
byte[] bytes = Base64.getEncoder().encode(base64.getBytes());
ByteArrayInputStream bas = new ByteArrayInputStream(bytes);
image = new Image(bas);
}
}
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Image must be non-null
at com.sun.prism.paint.ImagePattern.<init>(ImagePattern.java:47)
at com.sun.prism.paint.ImagePattern.<init>(ImagePattern.java:65)
at com.sun.javafx.tk.quantum.QuantumToolkit.createImagePatternPaint(QuantumToolkit.java:981)
at com.sun.javafx.tk.Toolkit.getPaint(Toolkit.java:680)
at javafx.scene.paint.ImagePattern.acc_getPlatformPaint(ImagePattern.java:292)
at javafx.scene.paint.Paint$1.getPlatformPaint(Paint.java:48)
at javafx.scene.shape.Shape.updatePGShape(Shape.java:963)
at javafx.scene.shape.Shape.doUpdatePeer(Shape.java:998)
at javafx.scene.shape.Shape$1.doUpdatePeer(Shape.java:131)
at com.sun.javafx.scene.shape.ShapeHelper.updatePeerImpl(ShapeHelper.java:74)
at com.sun.javafx.scene.shape.CircleHelper.updatePeerImpl(CircleHelper.java:64)
at com.sun.javafx.scene.NodeHelper.updatePeer(NodeHelper.java:103)
at javafx.scene.Node.syncPeer(Node.java:715)
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2399)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2545)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:421)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:420)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:450)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:575)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:555)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:548)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:353)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Cannot invoke "javafx.scene.Node.getScene()" because "<local2>" is null
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2398)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2545)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:421)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:420)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:450)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:575)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:555)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:548)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:353)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Cannot invoke "javafx.scene.Node.getScene()" because "<local2>" is null
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2398)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2545)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:421)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:420)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:450)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:575)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:555)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:548)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:353)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)