Java 在 Safari 中检测到异常但在 IE 中未检测到?
Java exception detected in safari but not detected in IE?
我有一个 java 小程序代码,当它从 IE 打开时工作正常,但如果它从 Safari 打开,Java 控制台会产生空指针异常。
生成此行为的代码如下所示:
public class MsgBoxPanel extends JDialog
{
Panel panel1 = new Panel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
public MsgBoxPanel()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.setBackground(Color.lightGray);
this.setLayout(null);
label1.setFont(common.COMPONENTS_FONT);
label2.setFont(common.COMPONENTS_FONT);
label2.setHorizontalAlignment(JLabel.CENTER);
label2.setText("Buy");
label2.setBounds(new Rectangle(0, -5, 400, 44));
label1.setHorizontalAlignment(JLabel.CENTER);
label1.setText("Are you sure?");
label1.setBounds(new Rectangle(0, 0, 400, 44));
panel1.setLayout(null);
panel1.add(label1, null);
panel1.add(label2, null);
}
public void setBounds(int x,int y,int width,int height)
{
super.setBounds(x,y,width,height);
this.setLayout(null);
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
this.add(panel1);
}
}
当我从 Safari (Mac OSX) 调用小程序时,java 控制台显示以下异常:
network: Created version ID: 1.8.0.45
network: Created version ID: 1.8.0.45
security: continue with running version
network: Created version ID: 1.8.0.45
network: Created version ID: 1.8
network: Created version ID: 8.0.45
basic: exception: java.lang.reflect.InvocationTargetException.
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.runOnEDTAndWait(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.instantiateApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at com.sun.deploy.uitoolkit.impl.awt.OldPluginAWTUtil.invokeAndWait(Unknown Source)
... 5 more
Caused by: java.lang.NullPointerException
at mutajara.MsgBoxPanel.setBounds(Unknown Source)
at java.awt.Component.move(Component.java:2101)
at java.awt.Component.setLocation(Component.java:2090)
at java.awt.Window.setLocation(Window.java:921)
at java.awt.Window.init(Window.java:510)
at java.awt.Window.<init>(Window.java:436)
at java.awt.Window.<init>(Window.java:591)
at java.awt.Dialog.<init>(Dialog.java:665)
at java.awt.Dialog.<init>(Dialog.java:409)
at javax.swing.JDialog.<init>(JDialog.java:272)
at javax.swing.JDialog.<init>(JDialog.java:206)
at javax.swing.JDialog.<init>(JDialog.java:154)
at mutajara.MsgBoxPanel.<init>(Unknown Source)
at mutajara.MainApplet.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue.run(EventQueue.java:731)
at java.awt.EventQueue.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Ignored exception: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
basic: Dialog type is not candidate for embedding
为了解决这个异常,我检测到主要原因是panel1实例为null,将这段代码添加到setBounds方法后,代码在safari中运行正常。
这里是修改后的 setBounds 方法:
public void setBounds(int x,int y,int width,int height)
{
super.setBounds(x,y,width,height);
this.setLayout(null);
//This if statement solved the exception
if(panel1 == null)
{
return;
}
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
this.add(panel1);
}
能否请您解释一下为什么会发生这种行为,以及为什么 panel1 实例变量为空。
当您在 Java 中扩展另一个 class 时,您的 class 属性(例如 panel1
)在 [=37= 之后才会被初始化] 超级构造函数已经完成。
我猜 JDialog's
构造的一部分涉及调用 setBounds
。您已经覆盖了此方法,因此该调用命中了您覆盖的 setBounds
。现在,因为 JDialog
仍处于构建阶段,您的 panel1
尚未创建和初始化。所以你得到了你的空指针异常。
不过你有更大的问题。 setBounds
可以在运行时调用很多。您不希望每次都删除并重新添加面板。
我会将这些行移出 setBounds
并移至 jbInit
方法的顶部:
this.setLayout(null);
this.add(panel1);
更新
你可以把你的 panel1.setBounds 放在那里:
public void setBounds(int x,int y,int width,int height) {
super.setBounds(x,y,width,height);
if (panel1 != null) {
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
}
}
或者,您可以让 Swing 使用 LayoutManager 为您完成,而不是自己定位组件:
//this.setLayout(null);
this.setLayout(new BorderLayout());
this.add(panel1);
// could use panel1.setBorder(...) to get your spacing around the outside
我有一个 java 小程序代码,当它从 IE 打开时工作正常,但如果它从 Safari 打开,Java 控制台会产生空指针异常。
生成此行为的代码如下所示:
public class MsgBoxPanel extends JDialog
{
Panel panel1 = new Panel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
public MsgBoxPanel()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.setBackground(Color.lightGray);
this.setLayout(null);
label1.setFont(common.COMPONENTS_FONT);
label2.setFont(common.COMPONENTS_FONT);
label2.setHorizontalAlignment(JLabel.CENTER);
label2.setText("Buy");
label2.setBounds(new Rectangle(0, -5, 400, 44));
label1.setHorizontalAlignment(JLabel.CENTER);
label1.setText("Are you sure?");
label1.setBounds(new Rectangle(0, 0, 400, 44));
panel1.setLayout(null);
panel1.add(label1, null);
panel1.add(label2, null);
}
public void setBounds(int x,int y,int width,int height)
{
super.setBounds(x,y,width,height);
this.setLayout(null);
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
this.add(panel1);
}
}
当我从 Safari (Mac OSX) 调用小程序时,java 控制台显示以下异常:
network: Created version ID: 1.8.0.45
network: Created version ID: 1.8.0.45
security: continue with running version
network: Created version ID: 1.8.0.45
network: Created version ID: 1.8
network: Created version ID: 8.0.45
basic: exception: java.lang.reflect.InvocationTargetException.
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.runOnEDTAndWait(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.instantiateApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at com.sun.deploy.uitoolkit.impl.awt.OldPluginAWTUtil.invokeAndWait(Unknown Source)
... 5 more
Caused by: java.lang.NullPointerException
at mutajara.MsgBoxPanel.setBounds(Unknown Source)
at java.awt.Component.move(Component.java:2101)
at java.awt.Component.setLocation(Component.java:2090)
at java.awt.Window.setLocation(Window.java:921)
at java.awt.Window.init(Window.java:510)
at java.awt.Window.<init>(Window.java:436)
at java.awt.Window.<init>(Window.java:591)
at java.awt.Dialog.<init>(Dialog.java:665)
at java.awt.Dialog.<init>(Dialog.java:409)
at javax.swing.JDialog.<init>(JDialog.java:272)
at javax.swing.JDialog.<init>(JDialog.java:206)
at javax.swing.JDialog.<init>(JDialog.java:154)
at mutajara.MsgBoxPanel.<init>(Unknown Source)
at mutajara.MainApplet.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue.run(EventQueue.java:731)
at java.awt.EventQueue.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Ignored exception: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
basic: Dialog type is not candidate for embedding
为了解决这个异常,我检测到主要原因是panel1实例为null,将这段代码添加到setBounds方法后,代码在safari中运行正常。
这里是修改后的 setBounds 方法:
public void setBounds(int x,int y,int width,int height)
{
super.setBounds(x,y,width,height);
this.setLayout(null);
//This if statement solved the exception
if(panel1 == null)
{
return;
}
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
this.add(panel1);
}
能否请您解释一下为什么会发生这种行为,以及为什么 panel1 实例变量为空。
当您在 Java 中扩展另一个 class 时,您的 class 属性(例如 panel1
)在 [=37= 之后才会被初始化] 超级构造函数已经完成。
我猜 JDialog's
构造的一部分涉及调用 setBounds
。您已经覆盖了此方法,因此该调用命中了您覆盖的 setBounds
。现在,因为 JDialog
仍处于构建阶段,您的 panel1
尚未创建和初始化。所以你得到了你的空指针异常。
不过你有更大的问题。 setBounds
可以在运行时调用很多。您不希望每次都删除并重新添加面板。
我会将这些行移出 setBounds
并移至 jbInit
方法的顶部:
this.setLayout(null);
this.add(panel1);
更新
你可以把你的 panel1.setBounds 放在那里:
public void setBounds(int x,int y,int width,int height) {
super.setBounds(x,y,width,height);
if (panel1 != null) {
panel1.setBounds(4,6,this.getSize().width-8,this.getSize().height-12);
}
}
或者,您可以让 Swing 使用 LayoutManager 为您完成,而不是自己定位组件:
//this.setLayout(null);
this.setLayout(new BorderLayout());
this.add(panel1);
// could use panel1.setBorder(...) to get your spacing around the outside