Java 断开的charAt()循环

Java 断开的charAt()循环,java,charat,Java,Charat,我被要求做以下工作: 修改介绍性问题1,按姓氏的字母顺序显示输入的姓名。 问题1:编写一个创建5 x 2阵列的程序。第一列表示名字,第二列存储姓氏。让用户输入5个完整(第一个和最后一个)名称以存储在此2D数组中。完成所有输入后,显示名称,但显示为LastName,first initial 我现在意识到,下面概述的方法不是攻击这个程序的正确/最有效的方法,但我仍然不明白为什么程序会以does的方式失败。当我在eclipse中运行程序时,它会打印一次问号行,然后抛出以下异常: 线程“main”ja

我被要求做以下工作:

修改介绍性问题1,按姓氏的字母顺序显示输入的姓名。 问题1:编写一个创建5 x 2阵列的程序。第一列表示名字,第二列存储姓氏。让用户输入5个完整(第一个和最后一个)名称以存储在此2D数组中。完成所有输入后,显示名称,但显示为LastName,first initial

我现在意识到,下面概述的方法不是攻击这个程序的正确/最有效的方法,但我仍然不明白为什么程序会以does的方式失败。当我在eclipse中运行程序时,它会打印一次问号行,然后抛出以下异常:

线程“main”java.lang.StringIndexOutOfBoundsException中出现异常:字符串索引超出范围:0 位于java.lang.String.charAt(未知源) 位于TwoD6.main(TwoD6.java:36)

它第二次运行时似乎失败了,我不明白为什么会这样。我曾尝试在变量类型之间进行更改,担心char的数字值不被接受(charAt命令最初在if语句中),并在用户之前填充数组(认为错误可能来自java不接受字符串将在位置0处包含字符)


import java.util.Scanner;
公共类TwoD6{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
System.out.println(“输入5个全名(第一个和最后一个)。”;
字符串[][]d2={{{“”“”},
{" "," "},
{" "," "},
{" "," "},
{" "," "} };
//新字符串[5][2];初始字符串声明,我以前认为这可能是问题的根源
对于(int i=0;i

如果你能给我解释一下,我将不胜感激。我并不是真的对解决这个问题感兴趣,因为我已经编写了一个更好的程序,但我想知道charAt()命令在这里出了什么问题,以及下次如何解决它。谢谢

没有实际的输入数据,人们只能猜测

乍一看,令人不快的代码行似乎是

char firstChar = d2[i][0].charAt(0); 
在最后一个
for
循环中

显然,发生错误的字符串是空的,因此尝试调用
charAt(0)
(即尝试读取第一个字符)会引发
StringIndexOutOfBoundsException
,因为空字符串没有任何要读取的字符

换句话说,您可能没有提供足够的输入,因此未填充
d2
数组,将一些值设置为空字符串。

第二次“for”循环中的“if block”中的代码将在2-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;
    }
真正的问题是跟踪一组行(对于循环的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;
    }
自a=”“,b=“” d2[i+1][0]和d2[i+1][1]的值只不过是一个长度为零的字符串。在循环的下一个索引中没有任何字符

您可以通过在代码中第二个for循环的开头和结尾添加以下行来自行测试它,并查看输出

 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)
[编辑]
而且,即使在修复了此错误之后,此代码也无法解决您试图解决的问题。由于此代码存在大量逻辑错误,因此该错误表示您试图访问字符串范围之外的字符。如果字符串的大小为0(例如:空字符串),这是可能的
charAt(0)
将在此处失败,因为它尝试访问不存在的第一个字符

通常,如果您曾经索引到字符串中,但无法保证该字符串是否为空,处理该字符串的一种方法是在尝试访问该字符之前,首先检查它是否为“有效”字符串。比如说

// Check if it actually has characters before accessing it
if (d2[i][0].length() > 0) {
   //access the string
}
// Check if it actually has characters before accessing it
if (d2[i][0].length() > 0) {
   //access the string
}