我正在尝试为我的程序编写一个图像加载函数,但它正在做一些奇怪的事情。
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
。
我做错了什么?
答案 0 :(得分:1)
这是因为Java通过值传递参数,而不是引用。就Java而言,img
中的loadImage
与background
无关。你所做的只是将地址传递给任何背景引用,而不是引用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,因为img
和background
都指null
,因为它们未初始化。
==
,当处理两个对象时,当且仅当它们都引用内存中的相同对象时才会返回true,而不是它们是相同的精确引用。