线程“main”中的异常java.lang.IllegalArgumentException:in不能为null

时间:2016-02-04 21:17:56

标签: java eclipse opennlp

我尝试使用OpenNLP库来使用它的sentencedetector,我尝试编写以下代码,但是我得到了与 en-sent.bin 文件的地址相关的异常,但我没有知道如何处理这个文件。

import java.io.*;
import java.net.URL;

import opennlp.tools.sentdetect.SentenceDetectorME;
import opennlp.tools.sentdetect.SentenceModel;
public class SentenceDetect 
{

       private SentenceDetectorME sentenceDetector;

        public void init()
        {
            /** Load and initialize the sentence detection model */

            InputStream modelIn = null;
            SentenceModel model = null;

            try {

                modelIn = SentenceDetect.class.getClassLoader().getResourceAsStream("Tokenizer/models/en-sent.bin");
                model = new SentenceModel(modelIn); //*<- line 36*
                }
            catch (IOException e) 
                {
                  e.printStackTrace();
                }
            finally {
                  if (modelIn != null) {
                        try {
                          modelIn.close();
                        }
                        catch (IOException e) {}
                      }
                }

            sentenceDetector = new SentenceDetectorME(model);

        }

        public String[] getSentences(String longSentence)
        {
            return sentenceDetector.sentDetect(longSentence);
        }

}

主要课程:

public static void main(String[] args)
    {

       SentenceDetect d = new SentenceDetect();


       d.init();   ///*<- line 10*

       String[] s = d.getSentences("This is sentence #1. This is Sentence #2");

       System.out.println( s[0] );  // Should be the first sentence

       System.out.println( s[1] );  // Should be the second sentence

    }

下图显示了我的项目的层次结构(对于我使用Ubuntu的图片感到抱歉,但我不知道在这里使用了打印屏幕按钮):

enter image description here

整个错误是:

`Exception in thread "main" java.lang.IllegalArgumentException: in must not be null!
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:179)
at opennlp.tools.sentdetect.SentenceModel.<init>(SentenceModel.java:95)
at SentenceDetect.init(SentenceDetect.java:36)
at Main.main(Main.java:10)`

我试过这些路径,但我得到了同样的错误:

  • /Tokenizer/models/en-sent.bin
  • /models/en-sent.bin
  • 模型/ EN-sent.bin
  • /home/suri/workspace/2/Tokenizer/models/en-sent.bin

3 个答案:

答案 0 :(得分:1)

您需要将路径更改为

 .getResourceAsStream("en-sent.bin");

由于getResourceAsStream读取包,因此这些文件(.bin)位于源文件夹中。

答案 1 :(得分:0)

更改

  .getResourceAsStream("Tokenizer/models/en-sent.bin");

 .getResourceAsStream("models/en-sent.bin");

你有&#34; Tokenizer&#34;在路径中,这是你的项目的名称,这是无关紧要的,所以你只需删除那一点! :)

答案 2 :(得分:0)

由于您正在使用getClassLoader().getResourceAsStream(),因此该文件必须位于您的类路径中。右键单击&#34;模型&#34; eclipse中的文件夹&#34;构建路径&#34; - &GT; &#34;用作源文件夹&#34;。然后确保您的路径与文件夹结构匹配。如果你保留照片中的内容,那就是&#34; models / en-sent.bin&#34;。

如果您希望这些.bin文件通常位于构建的.jar文件之外,则应使用构造FileInputStream代替可以采用绝对文件系统路径的文件。