0

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)

0 Answers0