让我澄清一下我要问的问题。我有一个我正在开发的 java 程序,它通过一个名为 JLine2 的 readline 库从键盘获取输入。该库将整个行类型作为命令,而不是将其分解为空格分隔的命令和参数。我正在寻找的是一种安全的方法来分解作为输入传递的字符串。
我尝试过使用数组,但由于我处于概念的早期阶段,我还不知道我的最大命令将有多少个参数,因此使用预初始化的数组我认为不会起作用。我遇到的问题是当我检查数组中的空值或检查是否存在特定命令或参数时。Java 不断抛出关于数组索引超出范围之类的异常。因为数组实际上没有数组索引 1 的值,它是数组索引 0 中命令的参数。
所以我正在寻找一种方法来获取一个字符串并安全地将其拆分为多个部分,而不会在发生数组异常时让 Java 对我大喊大叫。
这是我可以提供的非常苗条的代码...
ConfigShell.class
package shell;
import java.io.IOException;
import configFS.ConfigFS;
import jline.console.ConsoleReader;
public class ConfigShell {
private ConfigFS config;
public ConfigShell() throws IOException {
config = new ConfigFS();
}
public void init() throws IOException {
ConsoleReader console = new ConsoleReader();
// When the program starts we want to be placed at / (root).
console.setPrompt(">> ");
// In this case an infinite loop is better than a loop based on whether line is equal to null.
// This allows line to be equal to null and still stay inside the shell.
while (true) {
String line = console.readLine();
if (line != null) {
// If pre-initialize the array I can check for null as a value for an array index.
// If I did this at time I needed the array and there were not enough index occupied the system would return an exception.
String[] cmdArgs = new String[4];
// We need to split up the incoming line because JLine2 does not do it for me.
// This allows me to evaluate the entire command piece by piece rather all at once.
cmdArgs = line.split("\\s+");
if (cmdArgs[0] != null && cmdArgs[0].equals("add")) {
if (cmdArgs[1] != null && cmdArgs[1].equals("server")) {
if (cmdArgs[2] != null) {
config.addServer(cmdArgs[2]);
System.out.println("Added server " + cmdArgs[2] + " to the configuration successfully.");
}
}
}
if (cmdArgs[0].equals("exit")) {
System.exit(0);
}
}
}
}
}
测试注意事项:我的 Start.class 主方法调用了上述文件中的 init 方法。