Java BufferedImage未加载

时间:2011-01-27 05:04:42

标签: java bufferedimage

我正在尝试为我的程序编写一个图像加载函数,但它正在做一些奇怪的事情。

public void loadImage(BufferedImage img, String filepath) {
    try {
        img = ImageIO.read(new File(filepath));
    }
    catch (IOException e) {
    }
}

我这样称呼它:

BufferedImage background = null;
loadImage(background, path);

我在调试中看到img正确加载,但background一直保持为空并导致NullPointerException

当我更改为对background = ImageIO.read(new File(filepath));之类的背景的直接引用时,它就可以正常工作。

更奇怪的是System.out.println(img == background)打印true。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是因为Java通过传递参数,而不是引用。就Java而言,img中的loadImagebackground无关。你所做的只是将地址传递给任何背景引用,而不是引用background本身。 background基本上告诉参数img,“嘿,指出我指的是什么。”

当你去

img = ImageIO.read(new File(filepath));

您刚刚设置img来引用一些新对象,但背景仍将引用之前所指的任何内容。

相反,你应该返回 BufferedImage并将background设置为返回值,所以类似

public BufferedImage loadImage(String filepath) {
    try {
        return ImageIO.read(new File(filepath));
    }
    catch (IOException e) {
    }
   return null;
}

background = loadImage(path);

这个previous question有更多关于Java中的Pass-by-Value vs Pass-by-Reference问题的信息。就个人而言,传递参考文献的的想法花了我一段时间,直到我读到this article为止。

希望这有帮助。


关于img == background返回true的第二个注释,我不确定你在哪里检查这个,但是如果你在img = ImageIO...之前检查它,那将返回true,因为imgbackground都指null,因为它们未初始化。

==,当处理两个对象时,当且仅当它们都引用内存中的相同对象时才会返回true,而不是它们是相同的精确引用。