Java ClassNotFoundException我没有';我抓不到

Java ClassNotFoundException我没有';我抓不到,java,exception,try-catch-finally,Java,Exception,Try Catch Finally,我阅读了很多关于java中try/catch/finally进程的页面,但是我没有成功地在代码中捕捉到ClassNotFoundException。我使用for循环打开并以rdfxml格式保存作为参数的目录中的每个文件。我想要的是,当我执行代码时,我得到e.getmessage(),循环继续处理下一个文件 问题是我的脚本工作得非常好,但是当ClassNotFoundException发生时,我没有收到e.getmessage() @SuppressWarnings("finally") publ

我阅读了很多关于java中try/catch/finally进程的页面,但是我没有成功地在代码中捕捉到
ClassNotFoundException
。我使用for循环打开并以rdfxml格式保存作为参数的目录中的每个文件。我想要的是,当我执行代码时,我得到e.getmessage(),循环继续处理下一个文件

问题是我的脚本工作得非常好,但是当ClassNotFoundException发生时,我没有收到e.getmessage()

@SuppressWarnings("finally")
public static void main(String[] args) {

    File dir = new File(args[0]);
    File[] directoryListing = dir.listFiles();

    if (directoryListing != null) {
        for (File owlFile : directoryListing){
            String name = owlFile.getName();
                    try {
                        translateOwlToRdfXml(owlFile,name);
                    }
                    catch (OWLOntologyCreationException|OWLOntologyStorageException|ClassNotFoundException e) {
                        System.out.println(name + " has not been saved into RDF/XML;");
                        System.out.println(e.getMessage());
                        }
                    finally {
                        continue;
                    }
                }

            }
        }


    static void translateOwlToRdfXml(File owlFile, String name) throws OWLOntologyCreationException, OWLOntologyStorageException, ClassNotFoundException {

            OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

        System.out.println("Loaded ontology: " + name);
        OWLOntology ontology;
        ontology = manager.loadOntologyFromOntologyDocument(owlFile);
        RDFXMLOntologyFormat rdfxmlFormat = new RDFXMLOntologyFormat();

            manager.saveOntology(ontology, rdfxmlFormat, IRI.create(owlFile));
        System.out.println("Saved ontology in RDF/OWL: " + name);

    }
}
当我没有写入“finally”块时,我收到以下消息:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: com/github/jsonldjava/core/JsonLdError
    at org.openrdf.rio.jsonld.JSONLDParserFactory.getParser(JSONLDParserFactory.java:37)
    at org.openrdf.rio.Rio.createParser(Rio.java:195)
    at org.semanticweb.owlapi.rio.RioParserImpl.parseDocumentSource(RioParserImpl.java:241)
    at org.semanticweb.owlapi.rio.RioParserImpl.parse(RioParserImpl.java:191)
    at uk.ac.manchester.cs.owl.owlapi.ParsableOWLOntologyFactory.loadOWLOntology(ParsableOWLOntologyFactory.java:161)
    at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:975)
    at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:913)
    at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:928)
    at owl2rdf.owl2rdf.translateOwlToRdfXml(owl2rdf.java:57)
    at owl2rdf.owl2rdf.main(owl2rdf.java:32)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: com.github.jsonldjava.core.JsonLdError
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 15 more
但是当我写“finally”时,我什么也没有收到,代码继续处理下一个文件。我想我不清楚try/catch-and-throw方法是如何工作的


提前感谢

您只捕获catch(…)中列出的异常。堆栈跟踪显示主方法中的异常是NoClassDefFoundError

要解决它,请替换

catch (OWLOntologyCreationException|OWLOntologyStorageException|ClassNotFoundException e) {
      System.out.println(name + " has not been saved into RDF/XML;");
      System.out.println(e.getMessage());
}
By(在这里您可以捕获所有异常)

或者


尝试捕获
NoClassDefFoundError
而不是
ClassNotFoundException
。后者被前者包裹着

请参阅以下堆栈跟踪片段-这意味着该方法抛出
NoClassDefFoundError

Caused by: java.lang.NoClassDefFoundError: com/github/jsonldjava/core/JsonLdError
at org.openrdf.rio.jsonld.JSONLDParserFactory.getParser(JSONLDParserFactory.java:37)
at org.openrdf.rio.Rio.createParser(Rio.java:195)
at org.semanticweb.owlapi.rio.RioParserImpl.parseDocumentSource(RioParserImpl.java:241)
at org.semanticweb.owlapi.rio.RioParserImpl.parse(RioParserImpl.java:191)
at uk.ac.manchester.cs.owl.owlapi.ParsableOWLOntologyFactory.loadOWLOntology(ParsableOWLOntologyFactory.java:161)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:975)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:913)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:928)
at owl2rdf.owl2rdf.translateOwlToRdfXml(owl2rdf.java:57)

translateOwlToRdfXml
抛出
InvocationTargetException

InvocationTargetException is a checked exception that wraps
an exception thrown by an invoked method or constructor.

您需要捕获此异常,然后使用
getTargetException
获取
NoClassDefFoundError
。从那里你可以得到
getCause
给你的包装
ClassNotFoundException

可能是因为
继续语句。它抛出java.lang.reflect.InvocationTargetException,而不是您捕获的任何异常(),因此该异常没有被真正捕获。最后()并继续;让循环继续。正如Ken所说,ClassNotFoundException被包装在InvocationTargetException中,因此不会被catch块捕获。在finally块中继续操作会扰乱控制流,因此它会继续循环,但这样做不是一种好的方式,因为finally块将始终执行,即使没有异常,这可能会在将来导致错误。顺便说一句:在
finally
块中的
继续
没有意义(实际上,在您的情况下,可以删除整个
finally
。在try-catch之后,没有任何语句,但循环会再次启动。因此,finally-continue代码与将continue作为循环的最后一个语句一样。因此,它完全没有必要。
translateOwlToRdfXml
抛出
NoClassDefFoundError
。)nvocationTargetException是在更高级别上抛出的。感谢您的回复。正如您所想象的,我是Java新手。确切地说,我必须抛出并捕获
NoClassDefFoundError
Caused by: java.lang.NoClassDefFoundError: com/github/jsonldjava/core/JsonLdError
at org.openrdf.rio.jsonld.JSONLDParserFactory.getParser(JSONLDParserFactory.java:37)
at org.openrdf.rio.Rio.createParser(Rio.java:195)
at org.semanticweb.owlapi.rio.RioParserImpl.parseDocumentSource(RioParserImpl.java:241)
at org.semanticweb.owlapi.rio.RioParserImpl.parse(RioParserImpl.java:191)
at uk.ac.manchester.cs.owl.owlapi.ParsableOWLOntologyFactory.loadOWLOntology(ParsableOWLOntologyFactory.java:161)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:975)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:913)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:928)
at owl2rdf.owl2rdf.translateOwlToRdfXml(owl2rdf.java:57)
InvocationTargetException is a checked exception that wraps
an exception thrown by an invoked method or constructor.