Java BufferedImage не загружается - PullRequest
1 голос
/ 27 января 2011

Я пытаюсь написать функцию загрузки изображения для моей программы, однако она делает что-то странное.

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 Ответ

1 голос
/ 27 января 2011

Это потому, что 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);

Этот предыдущий вопрос содержит немного больше информации о проблеме передачи по значению по сравнению с передачей по ссылке в Java. Лично, идея о значении передаваемых ссылок заняла у меня какое-то время, чтобы понять это, пока я не прочитал эту статью .

Надеюсь, это поможет.


Что касается вашего второго замечания о том, что img == background возвращает true, я не уверен, где вы проверяете это, но если вы проверите его до img = ImageIO..., это вернет true, потому что img и background оба ссылаются на null, так как они неинициализированы.

== при работе с двумя объектами вернет true, если и только если они оба ссылаются на один и тот же объект в памяти, а не если они являются одной и той же точной ссылкой.

...