您好我想知道如何编写try和catch块来阻止以下错误。
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
我有这个方法,它接受一个句子并将其拆分为ArrayList。然后,我使用它将值存储到散列映射中,其中索引1是键,后面的单词变为值。我使用以下方法将用户输入拆分为数组。
私人扫描仪阅读器;
/**
* Create a new InputReader that reads text from the text terminal.
*/
public InputReader()
{
reader = new Scanner(System.in);
}
public ArrayList<String> getInput()
{
System.out.print("> "); // print prompt
String inputLine = reader.nextLine().trim().toLowerCase();
String[] wordArray = inputLine.split(" "); // split at spaces
// add words from array into ArrayList
ArrayList<String> words = new ArrayList<String>();
for(String word : wordArray) {
words.add(word);
}
return words;
}
}
以下方法使用上面的类来检测用户输入。因此,当用户输入写入时,他们可以写入散列映射,但是如果他们在输入键和值之前按下返回,我会得到超出范围的异常。那么如何重写以下方法以避免这种情况呢?
public void start()
{
boolean finished = false;
printWelcome();
while(!finished) {
ArrayList<String> input = reader.getInput();
if(input.contains("shutdown")) {
finished = true;
}
if (input.contains("load")) {
System.out.println();
instruct.readAndFill();
System.out.println();
}
if (input.contains("write")) {
String key = input.get(1);
String value = "";
for(int i=2; i<input.size(); i++) {
value = value + " " + input.get(i);
}
instruct.mapWrite(key, value);
}
}
instructorGoodBye();
}
很抱歉,如果我不够清楚,或者我的代码没有达到标准,那我现在只学习了大约2个月。
答案 0 :(得分:2)
基本上如果用户在一行上输入写入键值就可以了,但是如果他们在写入后点击返回则会发生错误。
所以,从根本上说,你所缺少的是错误检查。您的程序正在从用户那里获取输入,并假设它是有效的。 这总是一个坏主意。
相反,您应该验证从用户那里获得的内容。一种方法,你可以做到这一点,为你的&#34;写&#34;阻止,是为了确保你期望在那里的元素实际存在。
首先,我会按如下方式重写你的循环:
while(!finished) {
List<String> input = reader.getInput();
if(input.size() == 0) {
throw new IllegalArgumentException("Must specify command, one of 'shutdown', 'load', 'write'");
}
final String command = input.remove(0).toLowerCase();
// TODO: Make sure command is one of the valid commands!
请注意更改:
List
代替ArrayList
只是一种很好的通用做法。List.contains()
。考虑输入garbage garbage garbage write
,显然我们不希望这个调用&#34;写&#34;命令,应该被视为无效输入。最后,我们使用它来重写执行命令的条件:
if(command.equals("write")) {
// Make sure the user put the right stuff in here
// Since we removed the command from the input already, just make sure what is left is
if(input.size() <= 1) {
throw new IllegalArgumentException("Must specify correct data");
}
String key = input.remove(0);
String value = String.join(" ", input); // Java 8
instruct.mapWrite(key, value);
}
答案 1 :(得分:0)
您收到以下部分代码的错误..
if (input.contains("write")) {
String key = input.get(1);// here is the problem..
String value = "";
for(int i=2; i<input.size(); i++) {
value = value + " " + input.get(i);
}
instruct.mapWrite(key, value);
}
在此代码段的第2行中。 您正在使用索引访问值。现在想象一下,您只需在控制台中输入一个单词即可。所以你将从getInput()方法得到的arraylist的大小为1.所以..在arraylist中,这个单词将被放置在第0个位置。(这是第一个位置)但你正在访问第二个位置的值..这为您提供了债券例外的指数..
答案 2 :(得分:0)
基本上修复比抛出新异常并使用try和catch块更简单。我所要做的只是略微改变逻辑,只使用if else语句。
SqlBulkCopy
从目前为止我从java中学到的,最好的解决方案通常总是最简单的。感谢所有的帮助,每个评论并试图帮助我的人基本上帮助我提出了这个想法。