【问题标题】:Cannot load image getting null-pointer exception无法加载图像获取空指针异常
【发布时间】:2016-03-11 09:13:12
【问题描述】:

我正在尝试将“照片”文件夹中的图像添加到列表中。列表已经初始化,照片的相对路径是正确的。 PhotographyGame 是编写此方法的类的名称。当该方法尝试将图像“添加”到列表中时,我不断收到空指针异常。 救命!!

我还有一个案例,我使用了这种精确的方法并且没有任何问题!

    private List<Image> populateList()
    {
        photoList.add(new Image(PhotographicGame.class.getResourceAsStream("photographs/faces/face1.jpg"), 200, 400, true, true));
        return photoList;
    }

更新: 一旦我尝试执行上述操作,我就会收到如下错误:

    Mar 11, 2016 2:10:53 AM brainbright.gui.gameselect.GameSelectController startGame
SEVERE: null
javafx.fxml.LoadException: 
file:/C:/Users/D/Documents/3/Industrial/new/BrainBright-master/dist/run285479268/BrainBright.jar!/brainbright/gui/facenamehouse/FaceNameHouse.fxml:85

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at brainbright.gui.gameselect.GameSelectController.startGame(GameSelectController.java:362)
    at brainbright.gui.gameselect.GameSelectController.handleStartAction(GameSelectController.java:304)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$355(GlassViewEventHandler.java:388)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Can not set javafx.scene.layout.HBox field brainbright.gui.facenamehouse.FaceNameHouseController.faceContainer to javafx.scene.layout.VBox
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
    at java.lang.reflect.Field.set(Field.java:764)
    at javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1163)
    at javafx.fxml.FXMLLoader.access$1600(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:857)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:751)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
    ... 67 more

【问题讨论】:

  • NullPointerException 说明了什么?它是否说:java.lang.NullPointerException: Input stream must not be null?如果是,则未找到 jpg,如果未找到,则 photoList 未初始化且为空。
  • 好点。值得将其分解为较小的行。首先获取您的流,然后创建您的图像。然后将其添加到您的列表中。看看哪里出了问题。我认为这要么是您的路径有问题,要么是在路径中找不到资源。
  • 我确实把它分解了,我一直得到的错误是“photoList.add(image);”处的一个简单的空指针异常。行
  • 不,你需要初始化它,例如List photoList = new ArrayList();
  • @dailyadd 我建议你拿起一个Java fundamentals book 并研究它,以及basic Java trails

标签: java javafx


【解决方案1】:

首先,您的字符串没有在上面关闭。我假设它在您的实际代码中。

检查图像是否在您的类路径中,在该位置。我遇到了类似的问题,因为我忘记将图像部署到已编译的类文件夹中,准备构建到 JAR 中。

您可能必须在前面添加一个正斜杠,以便从类路径的根目录中引用它。否则,它可能会尝试从调用类中定位该相对路径。见这里:How do I reference a resource in Java?

我尝试了以下测试:

package test.game;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class MainApp extends Application {
    @Override
    public void start(Stage stage) {
        Image image = new Image(MainApp.class.getResourceAsStream("photos/faces/Sunset01.jpg"), 400, 200, true, true);
        ImageView imageView = new ImageView();
        imageView.setImage(image);

        Group group = new Group(imageView);
        Scene scene = new Scene(group, 800, 600);

        stage.setScene(scene);
        stage.setTitle("Main App");
        stage.show();
    }
}

我将 MainApp.java 文件放在 test/game 中,将 Sunset01.jpg 放在 test/game/photos/faces 中。它工作得很好。因此,这一定是您的图像加载、复制到输出目录、运行时类路径或初始化 photoList 的问题(例如List&lt;Image&gt; photoList = new ArrayList&lt;&gt;();)。

【讨论】:

  • 我尝试添加正斜杠,但没有解决问题。
  • 您可以将您的项目结构添加到问题中吗?检查图像是否确实在您引用的类路径中。
  • 是的,我 100% 确定它在该类路径上,正在访问的文件夹与PhotographicGame 类位于同一文件夹中。
  • 确保它被复制到你的输出目录。并尝试从类路径的根目录引用它:/fully/qualified/path/to/PhotographicGame/photographs/faces/face1.jpg。如果这不起作用,那么它可能没有被复制到您的输出目录。
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多