Reputation: 495
I read a lot of pages about the try/catch/finally process in java, but I didn't succeed to catch the ClassNotFoundException
in my code. I used a for loop to open and save in rdfxml format every file in a directory I give as the argument. What I want is when I'm performing the code I get the e.getmessage() and the loop continue to treat the next file.
The problem is my script works perfectly fine but I don't receive the e.getmessage() when the ClassNotFoundException occurs.
@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);
}
}
When I don't write the "finally" block, I receive this message:
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
But when I write the "finally", I receive nothing and the code continue to treat the next file. I thought I don't understand clearly how try/catch and throw methods work.
Thanks in advance
Upvotes: 5
Views: 6272
Reputation: 5463
translateOwlToRdfXml
throwing InvocationTargetException
.
InvocationTargetException is a checked exception that wraps
an exception thrown by an invoked method or constructor.
You need to catch this exception and then use getTargetException
to get the NoClassDefFoundError
. From there you can get the getCause
gives you the wrapper ClassNotFoundException
.
Upvotes: 0
Reputation: 719
You only catch exceptions you list in catch(...). The stack trace shows the exception in the main method is an NoClassDefFoundError.
To solve it replace
catch (OWLOntologyCreationException|OWLOntologyStorageException|ClassNotFoundException e) {
System.out.println(name + " has not been saved into RDF/XML;");
System.out.println(e.getMessage());
}
By (here you catch all exceptions)
catch (Exception e) {
System.out.println(name + " has not been saved into RDF/XML;");
System.out.println(e.getMessage());
}
Or by
catch (OWLOntologyCreationException|OWLOntologyStorageException
|ClassNotFoundException|NoClassDefFoundErrore) {
System.out.println(name + " has not been saved into RDF/XML;");
System.out.println(e.getMessage());
}
Upvotes: 3
Reputation: 1741
Try catching NoClassDefFoundError
instead of ClassNotFoundException
. The latter is wrapped by the former.
See the following stack trace fragment - it means that the method throws 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)
Upvotes: 1