【问题标题】:Uncaught Error: Error calling method on NPObject in javascript未捕获的错误:在 JavaScript 中调用 NPObject 方法时出错
【发布时间】:2012-04-28 10:37:24
【问题描述】:

我想使用小程序来更改存储库。为此,我编写了以下代码:

加载本体:

package owlapi.loader;

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.*;
import org.semanticweb.owlapi.model.*;
import org.semanticweb.owlapi.util.DefaultPrefixManager;
import org.semanticweb.owlapi.util.OWLEntityRenamer;

import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;


public class LoadOntology {
    private static String             ontologyDir   = "./owlapi/loader/featurepool.owl";
    private static OWLOntology        localOntology;
    private static OWLOntologyManager manager;
    private static OWLDataFactory     factory;
    private static PrefixManager      pm            = new DefaultPrefixManager("http://wise.vub.ac.be/Members/lamia/variability/Feature_Assembly/FAM.owl#");

public LoadOntology() {
    manager = OWLManager.createOWLOntologyManager();
    File file = new File(ontologyDir);
    try {
        localOntology = manager.loadOntologyFromOntologyDocument(file);
        System.out.println("Loaded ontology: " + localOntology);
        factory = manager.getOWLDataFactory();
        }   
    catch (UnparsableOntologyException e) {
        System.out.println("Could not parse the ontology: " + e.getMessage());
        Map<OWLParser, OWLParserException> exceptions = e.getExceptions();
        for (OWLParser parser : exceptions.keySet()) {
            System.out.println("Tried to parse the ontology with the " + parser.getClass().getSimpleName() + " parser");
            System.out.println("Failed because: " + exceptions.get(parser).getMessage());
        }
    }
    catch (UnloadableImportException e) {
        System.out.println("Could not load import: " + e.getImportsDeclaration());
        OWLOntologyCreationException cause = e.getOntologyCreationException();
        System.out.println("Reason: " + cause.getMessage());
    }
    catch (OWLOntologyCreationException e) {
        System.out.println("Could not load ontology: " + e.getMessage());
    }   
}

public void addInstance(String Class, String individual) {
    OWLClass owlClass = factory.getOWLClass(Class, pm);
    OWLClass superClass = factory.getOWLThing();
    OWLIndividual instance = factory.getOWLNamedIndividual(individual, pm);

    OWLClassAssertionAxiom classAssertion1 = factory.getOWLClassAssertionAxiom(superClass, instance);
    manager.addAxiom(localOntology, classAssertion1);
    OWLClassAssertionAxiom classAssertion2 = factory.getOWLClassAssertionAxiom(owlClass, instance);
    manager.addAxiom(localOntology, classAssertion2);
    System.out.println("Instance added");
}
}

InJava(用 javascript 加载的小程序):

public class InJava extends Applet{
private static LoadOntology loadedOntology;

public void addInstance(String Class, String individual) {
    Graphics g = getGraphics();
     g.drawString("Test", 10, 10);
    loadedOntology = new LoadOntology();
    loadedOntology.addInstance(Class, individual);
    }
}

当我加载小程序时,完全没有错误,但是当我尝试调用方法addInstance时:

<input type="button" value="call Java Applet method" onClick = 'document.owlapi.addInstance("Abstract_Feature", "New_Test")'>
<APPLET CODE="owlapi/InJava.class" NAME="owlapi" HEIGHT=100 WIDTH=100> </APPLET>  

浏览器抛出错误Uncaught Error: Error calling method on NPObject. 在stackoverflow上阅读了一些关于此的问题后,我得出的结论是插件一定有问题。

我在有效的方法(drawString("Test", 10, 10))中添加了一些测试代码,所以我建议构造 LoadOntology 类会产生一些问题(这个类在完美作品中单独测试过在其自己的)。有人看到我做错了吗?

更新: 我添加了小程序使用的 java 类的一部分:存储库加载器。所有提供的代码都应该编译。

更新:我没有使用MASCRIPT/SCRIPTABLE,因为代码基于this 示例,该示例适用于我当前的浏览器(chrome)

更新:您必须将 owlapi jars 包含到构建路径中,可以下载 here

【问题讨论】:

  • “有人知道我做错了什么吗?” 如果您链接到损坏的小程序并发布失败代码的SSCCE,我们可能会有更好的主意。顺便说一句 - 如果该小程序与 JavaScript 交互,为什么它不声明 MAYSCRIPT/SCRIPTABLE? JS 是做什么的?
  • 我添加了一些额外的信息,感谢您的回复
  • 1) “所有提供的代码都应该编译。” 只有当你下载了owlapi并且它在编译类路径中。这两种情况都不是。 2) 如果小程序确实需要owlapi,则需要将其添加到小程序的运行时类路径中。 3)那个链接呢? 4) File file = new File(ontologyDir); 这在沙盒小程序中不起作用。如果该资源在您的服务器上,它甚至不适用于受信任的小程序。在后一种情况下,通过 URL 访问它。 5) 就 HTML、类和 API Jars 的位置而言,服务器的结构是什么?
  • 顺便说一句 - 我认为你正处于这样一个阶段,你应该在没有任何 JS 参与的情况下让这一切都在纯 HTML 中工作,我认为这会引发问题。但发射还有问题,应该先排序。
  • 对。这将是另一个传奇。 1)我的观点是我不会那样做(这次不那么微妙)我会比大多数人更进一步试图提供帮助,但是下载一个 API 只是为了解决这样的问题?没有。2)它们需要添加到存档属性中。 3) 我指的不是Real's HowTo 上的链接。我说的是互联网上小程序的链接。你说你只有在本地磁盘上。加载它。您显然可以访问某个站点。 4)'..只用本地文件解决(?)'不是真的。 URL 将在本地文件系统(或 WWW 或类路径)上工作..

标签: java javascript html applet


【解决方案1】:

根据我知道的片段,我建议试试这个 HTML。

<html>
<body>
<APPLET 
    CODE="owlapi.InJava" 
    NAME="owlapi" 
    archive="owlapi/owl1.jar,owlapi/owl2.jar"
    HEIGHT=100 
    WIDTH=100> 
</APPLET>  
</body>
</html>

这个 HTML '静态地'嵌入了一个小程序——不使用 JavaScript。类名(code 属性)应该是类的完全限定名,而不是文件名。虽然后者通常是可以容忍的,但它是不正确的。它展示了如何从owlapi 目录导入API,根据需要更改名称。

还有一个问题是混合松散的类文件和罐子。这往往会使开发人员和 JRE 感到困惑。如果将owlapi.InJava 类放在my.jar 中,并且将Jar 放在与其余目录相同的目录中,则可以添加codebase 并且archive 路径会更短。像这样:

<html>
<body>
<APPLET 
    CODE="owlapi.InJava" 
    NAME="owlapi" 
    codebase="owlapi"
    archive="my.jar,owl1.jar,owl2.jar"
    HEIGHT=100 
    WIDTH=100> 
</APPLET>  
</body>
</html>

这不是有效的 HTML。这只是检查基础知识的测试。稍后,您需要使其成为有效的 HTML,并(可能)使用 applet info. page 中提到的 deployJava.js 部署小程序。

【讨论】:

  • 谢谢您,在您的帮助下,我成功地加载了存储库并更改了存储库的内部表示。我仍然有问题的唯一部分是我想要将更改保存到文件的部分。就像你之前说的,我担心没有简单的解决方案?
  • “唯一我仍然有问题的部分......”不,错了。在您的机器上获得一个工作小程序大约是在网络上工作一个小程序所需的 5%(供开发人员查看)。对于大多数访问者来说,这相当于在网上获得一个小程序所需的 1% 左右。 "..is the part where I want to save the changes" 你想写入文件吗? 实际上,保留这个答案您的下一个问题,因为似乎 "Uncaught Error: Error calling method on NPObject in javascript" 已解决,并且 this 问题已得到解答,对吧? '传奇'。 ;)
  • 小程序只能离线使用,并且是离线本体可视化器的一部分,所以我不需要小程序在网上工作。当我想保存/写入文件时,我得到同样的错误(在 NPObject 上调用方法)。如果最好还是开始一个新问题,我可以这样做。
  • 如需进一步关注,请提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2011-12-30
相关资源
最近更新 更多