0

我认为这个问题会更加具体和清晰。

这是我的代码,它执行简单的自动完成操作(有点)。

public class JLineExample {
    public static void main(String[] args) throws IOException {
        String line;
        ConsoleReader console = new ConsoleReader();
        console.setPrompt("> ");

        // Quit
        Completer quit = new StringsCompleter("quit");

        // Group #1
        Completer start = new StringsCompleter("start");
        Completer stop = new StringsCompleter("stop");

        // Group #2
        Completer propetry = new StringsCompleter("property");
        Completer hide = new StringsCompleter("hide");

        // Joint groups
        Completer executionGroup = new ArgumentCompleter(start, stop);
        Completer propertyGroup = new ArgumentCompleter(propetry, hide);
        Completer jointGroups = new ArgumentCompleter(executionGroup, propertyGroup);

        // Aggregator
        Completer aggregated = new AggregateCompleter(quit, jointGroups);

        console.addCompleter(aggregated);
        while ((line = console.readLine("> ")) != null) {
            if ("quit".equals(line.trim())) exit(1);
        }
    }
}

问题是将完成者合并为一组。我明白了

Exception in thread "main" java.lang.NullPointerException
        at jline.console.completer.ArgumentCompleter$AbstractArgumentDelimiter.delimit(ArgumentCompleter.java:283)
        at jline.console.completer.ArgumentCompleter.complete(ArgumentCompleter.java:116)
        at jline.console.completer.ArgumentCompleter.complete(ArgumentCompleter.java:152)
        at jline.console.completer.AggregateCompleter$Completion.complete(AggregateCompleter.java:121)
        at jline.console.completer.AggregateCompleter.complete(AggregateCompleter.java:80)
        at jline.console.ConsoleReader.complete(ConsoleReader.java:3261)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2621)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2269)
        at com.test.jline.JLineExample.main(JLineExample.java:52)

当按下一个TAB键。

有什么想法可以解决这种行为吗?

4

1 回答 1

1

您没有将完成程序设置为控制台完成程序,这就是您收到空指针异常的原因。

要么做:

Vector<String> wc = new Vector<String>();

wc.add("start");
wc.add("stop");
wc.add("load");
wc.add("clear");

console.addCompleter(
    new StringsCompleter(wc)
); 

或者您可以从外部文件构造它并将其加载到 StringsCompleter 构造函数中或像这样将其流式传输到其中:

console.addCompleter(
    new StringsCompleter(
        IOUtils.readLines(new GZIPInputStream(ConsoleDemo.class.getResourceAsStream("wordlist.txt.gz")))
    )
);

这只是取自https://jeszysblog.wordpress.com/2012/04/14/readline-style-command-line-editing-with-jline/的示例

words 文件由 Apache Commons IO 库加载,但也可以由 java I/O 完成,因为如果完全加载到内存中,令牌文件不是那么大,没有问题,否则您应该将令牌拆分为单独的集合并加载每个需要的时间。

于 2015-12-20T16:25:37.367 回答