【问题标题】:JApplet in IE8/JRE1.6.0_24 -- NullPointerException on getAppletContext() & JSObject.getWindow()IE8/JRE1.6.0_24 中的 JApplet -- getAppletContext() 和 JSObject.getWindow() 上的 NullPointerException
【发布时间】:2011-08-01 02:38:24
【问题描述】:

我有一个 JApplet,我正在 IE8 中使用 JRE Plugin v 1.6.0_24 加载,任何时候我尝试使用对网页的回调(ala getAppletContext() 或 JSObject.getWindow())我都会得到一个例外。基本上,IE 似乎不会因为标签而将我的 JApplet 视为实际的小程序?要么是这样,要么是我在 JApplet 中做错了什么。

这是我用来嵌入 JApplet 的 HTML 对象标签:

 <object codetype="application/java" 
     classid="clsid:CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA"
     codebase="http://java.sun.com/update/1.6.0/jinstall-6u24-windows-i586.cab"
     width="640" 
     height="480" 
     id="ImageEdit">

   <param name="code" value="my.imaging.test.class"/>
   <param name="codebase" value="/folder/" />
   <param name="type" value="application/x-java-applet;jpi-version=1.6.0_24" />
   <param name="cache_archive" value="test.jar, jai_core.jar, jai_codec.jar,
                                       mlibwrapper_jai.jar, axis.jar, jaxrpc.jar,
                                       jbig2.jar, PDFRenderer.jar"/>
   <param name="cache_version"  value="1.0.2.F, 1.1.3, 1.1.3, 1.1.3,
                                        1.0, 1.0, 1.0, 1.0"/>
   <param name="cache_archive_ex" value="test.jar;preload;1.0.2.F"/>
   <param name="cache_option" value="Plugin"/>
   <param name="scriptable" value="true"/>
   <param name="mayscript" value="true"/>
 </object>

这是 JSException 之一的相关部分:

Exception in thread "AWT-EventQueue-4" netscape.javascript.JSException
      at netscape.javascript.JSObject.getWindow(Unknown Source)
      at my.imaging.test.lblLoadPageMouseReleased(test.java:2180)
      at my.imaging.test.access$6600(test.java:74)
      at my.imaging.test$15.mouseReleased(test.java:1621)
      at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)...

Caused by: java.lang.NullPointerException
     at java.applet.Applet.getParameter(Unknown Source)
     ... 35 more

还有来自 getAppletContext() 的 NullPointerException:

java.lang.NullPointerException
      at java.applet.Applet.getAppletContext(Unknown Source)
      at my.imaging.test.lblCloseMouseReleased(test.java:2019)
      at my.imaging.test.access$6600(test.java:74)
      at my.imaging.test$15.mouseReleased(test.java:1621)
      at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)

所以在我的小程序中,显然我正在扩展 javax.swing.JApplet 并覆盖 init()。我的回调发生在鼠标释放事件上(由异常证明)。

private void lblLoadPageMouseReleased(java.awt.event.MouseEvent evt) {         
      JSObject window = null;
      URL url = null;                    
      try {
        url = new URL("http://127.0.0.1/folder/newpage.html");
        if (imageList.size() > 0) {
            if (JOptionPane.showConfirmDialog(rootPane, "Are you sure?", 
               "Question", JOptionPane.YES_NO_OPTION, 
               JOptionPane.QUESTION_MESSAGE, infoIcon) == JOptionPane.OK_OPTION) 
            {
               this.getAppletContext().showDocument(url, "_self");
            }
        } else {
            window = JSObject.getWindow(this);
            window.eval("nextPage()");
        }
    } catch(JSException jse){
        jse.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我被这个难住了。另外,仅供参考——我不想从命令行运行它,而 plugin.jar 在我的类路径中。任何关于我做错了什么的想法将不胜感激......谢谢!

编辑:SSCCE 下面

public class NewJApplet extends javax.swing.JApplet {

/** Initializes the applet NewJApplet */
@Override
public void init() {
    try {
        java.awt.EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                initComponents();
            }
        });

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

@SuppressWarnings("unchecked")
private void initComponents() {
    btnDo = new javax.swing.JButton();
    btnDo.setText("Do Something");
    btnDo.addActionListener(new java.awt.event.ActionListener() {

        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnDoActionPerformed(evt);
        }
    });
    this.getContentPane().add(btnDo);
}

private void btnDoActionPerformed(java.awt.event.ActionEvent evt) {
    URL url = null;
    try {
        url = new URL("http://127.0.0.1/folder/newpage.html");
        this.getAppletContext().showDocument(url, "_self");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private javax.swing.JButton btnDo;

}

this.getAppletContext().showDocument(url, "_self") 上的 NullPointerException

【问题讨论】:

  • 与其问“appletImageMgt.java 的哪一行是 2019 年?”,我建议您准备并发布一个SSCCE。请注意,第一个“s”表示在 2019 年附近不会出现任何异常行。SSCCE 应该可以在 100 行代码内(可能少至 40 行)。另请注意,如果您坚持类、方法和属性的通用命名法,其他人将更容易理解您的代码。这意味着AllWordsUpperCase 用于类名,firstWordLowerCase 用于方法和属性,SHOUTING_ALL_THE_WAY 用于常量。
  • 圣钼。你是来自here 的 Andrew Thompson 吗?你也提到了SSCCE! :)
  • 克里斯,你在 Firefox 或 Chrome 中看到同样的问题吗?
  • 标签不会在 FF 中呈现,尚未在 Chrome 中测试,因为它是一个仅限 IE 的应用程序。
  • @Andrew Thompson -- 添加了一个 SSCE。有趣的是,我没有在该应用程序上遇到异常。我不确定另一个小程序的问题是什么,因为它在浏览器中运行得很好——它只是不允许我获取上下文。

标签: java html applet nullpointerexception


【解决方案1】:

我会根据症状做一些猜测。

Applet.getParameterApplet.getAppletContext() 中有 NullPointerExceptions。这两种方法都获取 AppletStub 并调用此对象的方法。所以我猜你的 AppletStub 是null

为什么它可以为空?如果您的 Applet 不是浏览器中的顶级 Applet,而是放置在另一个 Applet 中的某个组件,则它可以为 null。看看这个。

【讨论】:

  • 这正是问题所在——尽管不是你描述的原因。似乎出于某种原因,NetBeans GUI 编辑器在我的 .form 中添加了以下内容: 这反过来又导致 NetBeans 在我的 initComponents() 方法中添加以下行: setStub(null);手动删除了记事本中的两个条目,神奇地我有了工作代码。
  • 我对错误的原因感到震惊。我不会怀疑即使是 NetBeans* 也是如此愚蠢。 (* 在看到 NetBeans 生成的无效 JNLP 文件后 - 我对它的看法相当低。)
  • @Chris 啊!同样的问题,在netbeans 7.1上。只是让我放松了一天的工作。任何对 getProperty 的调用都会引发空指针异常。 Netbeans 自动生成一个“setStub(null);”在 initComponents 部分中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多