On Tue, 8 Jul 2025 06:22:28 GMT, Prasanta Sadhukhan <psadhuk...@openjdk.org> 
wrote:

>> When trying to call 'icon.setImage(null);' where 'icon' is an instance of 
>> ImageIcon, a null pointer exception is thrown at runtime.
>> The code tried to get the `id` for that image and instantiates 
>> `MediaTracker` to associate the null image to that `id` and checks the 
>> status of loading this null image, removes the null image from the tracker 
>> and then tries to get the image width where it throws NPE as image is null.
>> 
>> It's better to not go through all MediaTracker usage and bail out initially 
>> itself for null image..
>
> Prasanta Sadhukhan has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   constructor test removal

> > I think we need to have the "whole picture" tested to make sure everything 
> > does as we expect. …\
> > When I wrote a little test, I see null args do generate NPEs but invalid 
> > args don't result in null images\
> > Toolkit images are installed, even if they can't be used because the source 
> > isn't valid. They are "effectively" null, but not "actually" null.
> 
> I tested with null image/imagedata and invalid imagedata and it seems only 
> these constructors throw NPE (current JDK) for null image (invalid image 
> doesnt throw any exception)

I wrote a JUnit test, it's more convenient than a jtreg test:

<details>
<summary><code>ImageIconConstructorsTest.java</code></summary>


import java.awt.Image;
import java.net.URL;

import javax.swing.ImageIcon;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class ImageIconConstructorsTest {
    @Test
    public void noArgs() {
        ImageIcon im = new ImageIcon();
        assertNull(im.getImage());
        assertNull(im.getDescription());
    }

    @Test
    public void stringNull() {
        ImageIcon im = new ImageIcon((String) null);
        assertNotNull(im.getImage());
        assertNull(im.getDescription());
    }

    @Test
    public void stringNullNull() {
        ImageIcon im = new ImageIcon((String) null, null);
        assertNotNull(im.getImage());
        assertNull(im.getDescription());
    }

    @Test
    public void stringNullWithDescription() {
        ImageIcon im = new ImageIcon((String) null, "Description");
        assertNotNull(im.getImage());
        assertEquals("Description", im.getDescription());
    }

    @Test
    public void byteArrayNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((byte[]) null));
//        ImageIcon im = new ImageIcon((byte[]) null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void byteArrayNullNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((byte[]) null, null));
//        ImageIcon im = new ImageIcon((byte[]) null, null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void byteArrayNullWithDescription() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((byte[]) null, "Description"));
//        ImageIcon im = new ImageIcon((byte[]) null, "Description");
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void urlNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((URL) null));
//        ImageIcon im = new ImageIcon((URL) null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void urlNullNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((URL) null, null));
//        ImageIcon im = new ImageIcon((URL) null, null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void urlNullWithDescription() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((URL) null, "Description"));
//        ImageIcon im = new ImageIcon((URL) null, "Description");
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void imageNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((Image) null));
//        ImageIcon im = new ImageIcon((Image) null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void imageNullNull() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((Image) null, null));
//        ImageIcon im = new ImageIcon((Image) null, null);
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

    @Test
    public void imageNullWithDescription() {
        assertThrows(NullPointerException.class,
                     () -> new ImageIcon((Image) null, "Description"));
//        ImageIcon im = new ImageIcon((Image) null, "Description");
//        assertNull(im.getImage());
//        assertNull(im.getDescription());
    }

}


</details>

All the test cases currently pass, and most constructors throw NPE for `null`. 
I haven't tested invalid arguments.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/25767#issuecomment-3049620519

Reply via email to