让我澄清一下我提出的问题。我有一个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 main方法调用上面文件中的init方法。
答案 0 :(得分:1)
你可以这样做:
String cmdArgs = line.split("\\s+");
然后,在访问任何特定索引之前,检查数组的 size ,这样就不会得到ArrayIndexOutOfBoundException
这样的事情:
if(cmdArgs.length>=2){
//It means you have at least 2 elements
//Now its safe to access cmdArgs[0] and cmdArgs[1]
}
答案 1 :(得分:0)
如果您的所有问题都是为可变数量的字符串设置存储空间,则可以使用ArrayList<String>
对象。
您将其声明为ArrayList<String> as = new ArrayList<String>();
然后,当您从命令字符串中拆分某些内容时,您只需使用add
方法:
as.add(yourString);
如果需要检索ArrayList的特定元素,可以使用其get
方法:
as.get(0);
您可以使用for each
循环处理所有元素:
for(String str: as) {
println(str):
}
点击此处查看info,此处查看an example。
答案 2 :(得分:0)
我认为您可以根据需要使用StringTokenizer
类及其方法。
请参阅下面的示例代码:
if(line!=null)
{
StringTokenizer st=new StringTokenizer(line);// by default it takes space as delimiter....you can use as required as second argument in constructor...
while(st.hasMoreTokens())
{
String token1=st.nextToken();
// do your stuffs here..........
// I don't know exactly about your required logic here......
/* if(token1.equals("add"))
{
String token2=st.nextToken();
if(token2.equals("server"))
{
String token3=st.nextToken();
config.addServer(token3);
System.out.println("Added server " + token3 + " to the configuration successfully.");
}
}
*/
}// while closing...
}// outer if closing...
或者PM 77-1告诉你可以使用ArrayList。但是我认为LinkedList应该是更好的选择。