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