2016-04-21 59 views
0

我遇到了这个问题,我找不到解决这个异常的方法。请帮忙。 我的程序试图找出名词,动词和形容词来自用户给出的句子(这里我试图找出名词)。如果我在程序中犯了错误,请指出这些错误,以便我可以纠正错误。 这里是我的代码:我如何处理这个名词发现程序中的ArrayIndexOutOfBoundException

enter code here 

import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.HashSet; 
import java.util.Set; 

import opennlp.tools.cmdline.parser.ParserTool; 
import opennlp.tools.parser.Parse; 
import opennlp.tools.parser.Parser; 
import opennlp.tools.parser.ParserFactory; 
import opennlp.tools.parser.ParserModel; 
import opennlp.tools.util.ObjectStream; 

public class ParserTest { 

static Set<String> nounPhrases = new HashSet<>(); 
static Set<String> adjectivePhrases = new HashSet<>(); 
static Set<String> verbPhrases = new HashSet<>(); 
static String result; 
gui_demo gd = new gui_demo(); 
String line = practice.gui_demo.textField1.getText(); 
public ParserTest(String line) { 
    // TODO Auto-generated constructor stub 
} 


public ParserTest() { 
    // TODO Auto-generated constructor stub 
} 

//ObjectStream<String> lineArr = new PlainTextByLineStream(new StringReader(line)); 

String[] lineArr = line.split("."); 
public void getNounPhrases(Parse p) { 
    if (p.getType().equals("NN") || p.getType().equals("NNS") || p.getType().equals("NNP") || p.getType().equals("NNPS")) { 
     nounPhrases.add(p.getCoveredText()); 
     System.out.println(p.getCoveredText()); 
    } 

    if (p.getType().equals("JJ") || p.getType().equals("JJR") || p.getType().equals("JJS")) { 
     adjectivePhrases.add(p.getCoveredText()); 
     System.out.println(p.getCoveredText()); 
    } 

    if (p.getType().equals("VB") || p.getType().equals("VBP") || p.getType().equals("VBG")|| p.getType().equals("VBD") || p.getType().equals("VBN")) { 
     verbPhrases.add(p.getCoveredText()); 
     System.out.println(p.getCoveredText()); 
    } 

    for (Parse child : p.getChildren()) { 
     getNounPhrases(child); 
    } 
} 


public void parserAction() throws Exception { 
    try{ 
    InputStream is = new FileInputStream("en-parser-chunking.bin"); 
    ParserModel model = new ParserModel(is); 
    Parser parser = ParserFactory.create(model); 
    for(int i=1; i <= lineArr.length; i++){ 
    Parse topParses[] = ParserTool.parseLine(lineArr[i], parser , 1);  //getting Exception 

    for (Parse p : topParses){ 
     //p.show(); 
     getNounPhrases(p); 
    } 
    } 
    }catch(Exception e){ 
     System.out.print(e); 
    } 
} 
public static void main(String[] args) throws Exception { 

    new ParserTest().parserAction(); 
    result = "Nouns :" +nounPhrases.toArray(new String[nounPhrases.size()]);//+ "\n" + "Verbs:" + verbPhrases + "Adjectives:" + adjectivePhrases; 
    /*System.out.println("List of Noun Parse : "+nounPhrases); 
    System.out.println("List of Adjective Parse : "+adjectivePhrases); 
    System.out.println("List of Verb Parse : "+verbPhrases); */ 
    } 

} 

而且程序的输出是:

java.lang.ArrayIndexOutOfBoundsException:1

回答

2

您有:

for(int i=1; i <= lineArr.length; i++) { 
    Parse topParses[] = ParserTool.parseLine(lineArr[i], parser , 1); 
} 

由于第一个索引是0而不是1,所以数组的最后一个索引始终小于其长度的一个索引。因此,lineArr[lineArr.length-1]是最后一个索引。

您需要将i <= lineArr.length更改为i < lineArr.length

此外,i开始于1而不是0。如果你这样做,你需要确保你的数组至少有两个元素,你没有。你也需要改变它。

最终的结果应该是:

for(int i=0; i < lineArr.length; i++) { 
    Parse topParses[] = ParserTool.parseLine(lineArr[i], parser , 1); 
} 
相关问题