首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中断的charAt()循环

中断的charAt()循环
EN

Stack Overflow用户
提问于 2013-12-16 18:39:43
回答 3查看 360关注 0票数 0

我被要求做以下工作:

更改介绍性问题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位置有字符的错误)。

代码语言:javascript
复制
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()命令哪里出了问题,下一次如何修复它,所以我并不真正感兴趣地修复这个问题。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-16 19:27:31

在第二个"for“循环中,"if-block”中的代码将在2数组中的下一个索引中存储一个零长度字符串,这将在下一次迭代中导致异常。

真正的问题是遵循一组行(第二行为循环的if块)

代码语言:javascript
复制
   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;
    }

最精确的线条

代码语言:javascript
复制
         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的值只不过是一个零长度字符串。循环中的下一个索引中没有任何字符。

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

代码语言:javascript
复制
 System.out.println(i+"  "+d2[i][0]+" ---- "+d2[i+1][0]);

这是我得到的

代码语言:javascript
复制
   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
EN

Stack Overflow用户

发布于 2013-12-16 18:43:28

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

乍一看,冒犯的代码行似乎是

代码语言:javascript
复制
char firstChar = d2[i][0].charAt(0); 

在最后一个for循环中。

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-12-16 19:48:24

此错误意味着您正在尝试访问超出字符串范围的字符。如果字符串的大小为0(例如:空字符串),这是可能的。charAt(0)在这里会失败,因为它试图访问第一个不存在的字符。

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

代码语言:javascript
复制
// Check if it actually has characters before accessing it
if (d2[i][0].length() > 0) {
   //access the string
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20618334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档