社区注意:请不要将其作为重复关闭,因为我正在研究的特定问题已表现为空指针异常。从堆栈跟踪中可以看出,NPE在Tika库中埋藏了4层深。这意味着在NPE上现有的StackExchange帖子中给出的所有好建议,没有一个Tika开发人员认为适合在四个模块中应用该建议(检查空指针)。它不是学习Tika并使用补丁来改进他们的代码来完成这项工作,而是认为询问是否有人实现了使用SourcCodeParser的常见用例会更有效。
我正在寻找有关Tika图书馆已发布示例的帮助。我没有编写示例代码。我见过许多与Tika库有关的类似问题,它有20个贡献者和数千行代码。请不要关闭这个问题,因为我相信任何以前使用此Parser的人都可以很快回答这个问题。我已经阅读了关于NullPointerException的帖子,并且正在遵循这个问题的建议:
我仍然无法找到问题
如果您尝试调试问题但仍然没有解决方案,那么您 可以发布问题以获得更多帮助,但请确保包含哪些内容 你到目前为止已经尝试过了。至少包括堆栈跟踪 问题,并在代码中标记重要的行号。
由于我花了很多时间创作这篇文章,检索并包含相关的堆栈跟踪和源代码,如果你允许它在一个未闭合的状态下花费一点时间,那么我真的很感激。熟悉Tika可能会看一下看似相当普遍的问题。正如您所知道的Java专家一样,许多空指针异常问题可能并非易事,尤其是在使用大型不熟悉的框架时。我非常感谢你的帮助。
我编写了一个简单的程序来测试Tika SourceCodeParser
,将其替换为来自the Tika Examples page的XHTML解析示例中的AutoDetectParser
。在第137行执行parse命令时,存在NullPointerException。看来,Parser代码的第180行in
可能缺少一名代表。
AutoDetectParser
有效,但未将源代码标识为java。
当我使用Tika桌面应用程序时,它可以正常工作并将代码识别为Java。
如何初始化SourceCodeParser
以避免NullPointerException
在操作时出现?{/ p>
使用Tika的示例"示例"封装 的 LocalFile.toTikaXhtmlString()
123 /** Parses as Tika using source code parser.
124 *
125 * @param filePathParam path to file to parse
126 */
127 public static String toTikaXhtmlString(final String filePathParam)
128 throws IOException, SAXException, TikaException
129 {
130 SourceCodeParser parser = new SourceCodeParser();
131 ContentHandler handler = new ToXMLContentHandler();
132 Metadata metadata = new Metadata();
133 File file = new File(filePathParam);
134 try (InputStream stream
135 = ContentHandlerExample.class
136 .getResourceAsStream(filePathParam)) {
137 parser.parse(stream, handler, metadata);
138 return handler.toString();
139 } catch (Exception e) {
140 System.out.println("Caught exception.");
141 System.out.println(e.toString());
142 e.printStackTrace();
143 throw e;
144 }
145
146 }
我也尝试过避免使用Tika' ContentHandlerExample'使用与InputStreamReader直接调用的类,结果相同:
public static String toTikaXhtmlString(final String filePathParam)
throws IOException, SAXException, TikaException
{
SourceCodeParser parser = new SourceCodeParser();
ContentHandler handler = new ToXMLContentHandler();
Metadata metadata = new Metadata();
File file = new File(filePathParam);
try (InputStream stream = new FileInputStream(file)) {
parser.parse(stream, handler, metadata);
return handler.toString();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
JUNIT测试
108 @Test
109 public void parseFile() {
110 String fileName, verifyInput, resultContent;
111
112 //arrange
113 fileName = "/Users/johnmeyer/Projects/code-proc/FileParseTest-run.txt";
114
115 String fileContent = "/** Test */ public MyTestClass {"
116 + "public static void main(String[] args) {"
117 + "System.out.println(\"This is a test.\"); }";
118
119
120 LocalFile.putText(fileName, fileContent);
121
122 verifyInput = LocalFile.getContent(fileName);
123
124 assertEquals(fileContent, verifyInput);
125 //act (and clean up)
126
127 try {
128
129 resultContent = LocalFile.toTikaXhtmlString(fileName);
130 } catch (Exception e) {
131 throw new RuntimeException(e.getMessage());
132 }
133
134 LocalFile.delete(fileName);
135
136 //assert
137 assertEquals(fileContent, resultContent);
138 }
堆栈跟踪
[INFO]运行us.johnmeyer.test.tools.FileParseTest捕获异常。 java.lang.NullPointerException java.lang.NullPointerException at org.apache.commons.io.input.ProxyInputStream.markSupported(ProxyInputStream.java:181) 在 org.apache.tika.detect.AutoDetectReader.getBuffered(AutoDetectReader.java:137) 在 org.apache.tika.detect.AutoDetectReader。(AutoDetectReader.java:114) 在 org.apache.tika.parser.code.SourceCodeParser.parse(SourceCodeParser.java:93) 在 org.apache.tika.parser.AbstractParser.parse(AbstractParser.java:53) 在 us.johnmeyer.utilities.LocalFile.toTikaXhtmlString(LocalFile.java:137) 在 us.johnmeyer.test.tools.FileParseTest.parseFile(FileParseTest.java:129) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)at at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)at at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)at at org.junit.runners.ParentRunner.run(ParentRunner.java:309)at at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:369) 在 org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:275) 在 org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:239) 在 org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:160) 在 org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:373) 在 org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:334) 在 org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:119) 在 org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:407)
Tika源代码
17 package org.apache.tika.io;
18
19 import java.io.FilterInputStream;
20 import java.io.IOException;
21 import java.io.InputStream;
22
23 /**
24 * A Proxy stream which acts as expected, that is it passes the method
25 * calls on to the proxied stream and doesn't change which methods are
26 * being called.
27 * <p>
28 * It is an alternative base class to FilterInputStream
29 * to increase reusability, because FilterInputStream changes the
30 * methods being called, such as read(byte[]) to read(byte[], int, int).
31 * <p>
32 * See the protected methods for ways in which a subclass can easily decorate
33 * a stream with custom pre-, post- or error processing functionality.
34 *
35 * @author Stephen Colebourne
36 * @version $Id$
37 */
38 public abstract class ProxyInputStream extends FilterInputStream {
40 /**
41 * Constructs a new ProxyInputStream.
42 *
43 * @param proxy the InputStream to delegate to
44 */
45 public ProxyInputStream(InputStream proxy) {
46 super(proxy);
47 // the proxy is stored in a protected superclass variable named 'in'
48 }
...
174 /**
175 * Invokes the delegate's <code>markSupported()</code> method.
176 * @return true if mark is supported, otherwise false
177 */
178 @Override
179 public boolean markSupported() {
180 return in.markSupported();
181 }