2011-01-27 3 views
1

Я пытаюсь написать функцию imageloading для своей программы, однако это делает что-то странное.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

Это связано с тем, что 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. Лично идея о значения переданных ссылок заставляла меня занять некоторое время, пока я не прочитал this article.

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


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

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

+0

Спасибо. Мне было интересно, почему img == background возвращается true. –

Смежные вопросы