我认为这个问题会更加具体和清晰。
这是我的代码,它执行简单的自动补全操作(某种意义上)。
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键时。
有没有什么办法可以解决这个问题呢?
发布于 2015-12-21 00:25:37
你没有在控制台完成器中设置完成器,这就是为什么你会得到空指针异常。
执行以下任一操作:
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/的例子
单词文件是由Apache Commons IO库加载的,但它也可以通过java I/O完成,因为如果完全加载到内存中,令牌的文件不会有那么大的问题,否则您应该将令牌拆分成单独的集合,并在需要时加载每个令牌。
https://stackoverflow.com/questions/28518128
复制相似问题