United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 7036148 NullPointerException with null JMenu name
7036148 : NullPointerException with null JMenu name

Details
Type:
Bug
Submit Date:
2011-04-13
Status:
Closed
Updated Date:
2012-03-20
Project Name:
JDK
Resolved Date:
2011-05-12
Component:
client-libs
OS:
windows_xp
Sub-Component:
javax.swing
CPU:
x86
Priority:
P3
Resolution:
Fixed
Affected Versions:
7
Fixed Versions:
7

Related Reports

Sub Tasks

Description
FULL PRODUCT VERSION :
java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b137)
Java HotSpot(TM) Client VM (build 21.0-b07, mixed mode, sharing)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
Using the supplied code, Java 7 throws a NullPointerException. Java 6 and earlier work fine.

Unfortunately I can't attach the icon.png file I used but any image will do.

REGRESSION.  Last worked in version 6u24

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Load the class

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Class displays a menu with an icon but no text
ACTUAL -
An exception is thrown

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.NullPointerException
	at sun.swing.SwingUtilities2.getLeftSideBearing(SwingUtilities2.java:274)
	at sun.swing.MenuItemLayoutHelper.getLeftExtraWidth(MenuItemLayoutHelper.java:162)
	at sun.swing.MenuItemLayoutHelper.calcExtraWidths(MenuItemLayoutHelper.java:158)
	at sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:148)
	at sun.swing.MenuItemLayoutHelper.<init>(MenuItemLayoutHelper.java:107)
	at javax.swing.plaf.basic.BasicMenuItemUI.getPreferredMenuItemSize(BasicMenuItemUI.java:412)
	at javax.swing.plaf.basic.BasicMenuItemUI.getPreferredSize(BasicMenuItemUI.java:367)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1660)
	at javax.swing.BoxLayout.checkRequests(BoxLayout.java:483)
	at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:300)
	at javax.swing.plaf.basic.DefaultMenuLayout.preferredLayoutSize(DefaultMenuLayout.java:60)
	at java.awt.Container.preferredSize(Container.java:1772)
	at java.awt.Container.getPreferredSize(Container.java:1757)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
	at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:922)
	at java.awt.Container.preferredSize(Container.java:1772)
	at java.awt.Container.getPreferredSize(Container.java:1757)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
	at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
	at java.awt.Container.preferredSize(Container.java:1772)
	at java.awt.Container.getPreferredSize(Container.java:1757)
	at java.awt.Window.pack(Window.java:808)
	at replication.NullMenuIssue.<init>(NullMenuIssue.java:19)
	at replication.NullMenuIssue.main(NullMenuIssue.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:613)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------

package replication;

import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public final class NullMenuIssue extends JFrame {
	public NullMenuIssue() throws HeadlessException {
		super("Null Menu Name Test");
		JMenuBar bar = new JMenuBar();
		bar.add(createMenu());
		setJMenuBar(bar);
		pack();
	}

	private JMenu createMenu() {
		final String name = null;
		final ImageIcon icon = new ImageIcon(getClass().getResource("icon.png"));

		Action menuAction = new TestAction(name, icon);
		JMenu menu = new JMenu(menuAction);
		menu.add(new JMenuItem("test"));
		return menu;
	}

	public static void main(String[] args) {
		final NullMenuIssue nullMenuIssue = new NullMenuIssue();
		nullMenuIssue.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		nullMenuIssue.setVisible(true);
	}

	private class TestAction extends AbstractAction {
		public TestAction(final String name, final ImageIcon icon) {
			super(name, icon);
		}

		public void actionPerformed(ActionEvent e) {
			//do nothing
		}
	}
}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
use an empty string instead of null for the action name.

                                    

Comments
EVALUATION

SwingUtilties.getLeftSideBearing() have to have the null check
                                     
2011-04-14



Hardware and Software, Engineered to Work Together