我被要求做以下工作:
更改介绍性问题1,以显示输入的名称按姓氏的字母顺序。问题1:编写一个创建5x2数组的程序。第一列表示名字,第二列将存储姓氏。让用户输入5个完整的(第一个和最后一个)名称来存储在这个2D数组中。接受所有输入后,显示名称,但将其显示为LastName,第一个初始值。
我现在意识到,下面概述的方法并不是攻击这个程序的正确/最有效的方法,但是我仍然很困惑为什么程序会以这样的方式失败。当我在eclipse中运行程序时,它只打印一行问号,然后抛出以下异常:
线程"main“java.lang.StringIndexOutOfBoundsException中的异常:超出范围的字符串索引:在TwoD6.main的java.lang.String.charAt(未知源)处为0(TwoD6.java:36)
它似乎在第二次运行时就失败了,我不明白为什么会这样。我尝试在变量类型之间更改它,担心字符的数字值不被接受( charAt命令最初在if语句中),并在用户之前填充数组(可能是因为java不接受字符串在0位置有字符的错误)。
import java.util.Scanner;
public class TwoD6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Input 5 full names (first and last).");
String [][] d2 = { { " "," " },
{" "," "},
{" "," "},
{" "," "},
{" "," "} };
//new String[5][2]; initial string declaration, which I previously thought could be the source of the issues
for(int i = 0; i < d2.length; i++)
{
d2 [i][0] = sc.next();
d2 [i][1] = sc.next();
}
for(int i = 0; i < d2.length-1; i++)
{
char c = d2[i][1].charAt(0);
char d = d2[i+1][1].charAt(0);
int e = c; int f = d;
if(e < f)
{
System.out.println("????????????????"); //implemented to see how many times the loop runs; currently prints once
String a = ""; String b = ""; //switchers
d2[i][0] = a; d2[i][1] = b;
d2[i][0] = d2[i+1][0]; d2[i+1][0] = a;
d2[i][1] = d2[i+1][1]; d2[i+1][1] = b;
}
}
for(int i = 0; i < d2.length; i++) //printing the array
{
char firstChar = d2[i][0].charAt(0);
System.out.println(d2[i][1] + ", " + firstChar + ".");
}
}
} 如果你能给我任何解释,我将不胜感激。由于我已经编写了一个更好的程序,但我想知道charAt()命令哪里出了问题,下一次如何修复它,所以我并不真正感兴趣地修复这个问题。谢谢!
发布于 2013-12-16 19:27:31
在第二个"for“循环中,"if-block”中的代码将在2数组中的下一个索引中存储一个零长度字符串,这将在下一次迭代中导致异常。
真正的问题是遵循一组行(第二行为循环的if块)
if(e < f)
{
System.out.println("????????????????"); //implemented to see how many times the loop runs; currently prints once
String a = ""; String b = ""; //switchers
d2[i][0] = a; d2[i][1] = b;
d2[i][0] = d2[i+1][0]; d2[i+1][0] = a;
d2[i][1] = d2[i+1][1]; d2[i+1][1] = b;
}最精确的线条
d2[i][0] = a; d2[i][1] = b;
d2[i+1][0] = a; // THIS ONE WILL CAUSE PROBLEM IN NEXT ITERATION
d2[i+1][1] = b; // THIS ONE WILL CAUSE PROBLEM IN NEXT ITERATION由于a="“,b ="”,所以d2i+1和d2i+1的值只不过是一个零长度字符串。循环中的下一个索引中没有任何字符。
您可以通过在代码中的第二段循环的开头和结尾添加以下行来测试它自己,并查看输出
System.out.println(i+" "+d2[i][0]+" ---- "+d2[i+1][0]);这是我得到的
Input 5 full names (first and last).
as gh
qe fg
er ty
df gr
yp dfg
0 as ---- qe
0 as ---- qe //end of 0th loop
1 qe ---- er
???????????????? //if block executed in 1st loop
1 er ---- // end of loop notice value at index 2 is blank now
2 ---- df // Now we'll have exception in this line
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:686)
at javaapplication7.Main.main(Main.java:33)同时,这段代码也不能解决你想要解决的问题,即使你已经修复了这个错误。因为这段代码有很多逻辑错误。
发布于 2013-12-16 18:43:28
如果没有实际的输入数据,人们只能猜测。
乍一看,冒犯的代码行似乎是
char firstChar = d2[i][0].charAt(0); 在最后一个for循环中。
显然,发生错误的字符串是空的,因此试图调用charAt(0) (即尝试读取第一个字符)会抛出一个StringIndexOutOfBoundsException,因为空字符串没有任何字符可读取。
换句话说,您可能没有提供足够的输入,因此d2数组没有被填充,将一些值设置为空字符串。
发布于 2013-12-16 19:48:24
此错误意味着您正在尝试访问超出字符串范围的字符。如果字符串的大小为0(例如:空字符串),这是可能的。charAt(0)在这里会失败,因为它试图访问第一个不存在的字符。
通常,如果您曾经索引到一个字符串,但是不能保证该字符串是否为空,那么处理该字符串的一种方法是在尝试访问该字符之前先检查它是否为“有效”字符串。例如
// Check if it actually has characters before accessing it
if (d2[i][0].length() > 0) {
//access the string
}https://stackoverflow.com/questions/20618334
复制相似问题