On Tue, 8 Jul 2025 06:22:28 GMT, Prasanta Sadhukhan <[email protected]>
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