【问题标题】:Unexpected perplexing error thrown抛出意外的令人困惑的错误
【发布时间】:2014-09-11 15:26:01
【问题描述】:

我正在编写一个相当简单的 Java 程序,它提示用户输入 2 个字符串,然后根据第二个字符串对第一个字符串进行格式化并相应地输出。

此处理通过删除第一个字符串中与第二个字符串中的每个字符相对应的每个字符并在预期的更改后输出第一个字符串来进行。这可能看起来令人费解和难以理解。

例如:
假设我们有以下 2 个字符串作为输入:

lennon
Ln

输出:

eo

从第一个字符串中删除所有出现的字符“L”和“n”之后(不考虑大小写)

这是相关的程序:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.format("Enter 2 Strings, schmuck:%n");
String s1 = br.readLine();
String s2 = br.readLine();
List<Character> l = new ArrayList<>();
for(int i = 0; i < s1.length(); i++)
{
    l.add(s1.charAt(i));
}
char ch;
for(int i = 0; i < s2.length(); i++)
{
    ch=s2.charAt(i);

    while((l.indexOf(ch)) != -1)
    {
        if(Character.isUpperCase(ch))
        l.remove(ch);
        l.remove(Character.toLowerCase(ch));
    }
}
for(Character c : l)
{
    System.out.printf("%c", c);
}

它正在抛出一个IndexOutOfBoundsException。我觉得它诡异而令人困惑,我觉得我已经陷入了僵局。也许这是一个愚蠢的错误。任何形式的帮助都会欣喜若狂。

【问题讨论】:

  • 这是正则表达式替换的工作,而不是嵌套 for / while 循环
  • 顺便说一句,您的程序不会完全按照您的预期进行。尝试以下字符串:lennonLN,然后找出原因。
  • 哎呀...有点错过了在进入 while 循环之前使相关案例一致,嗯。塔,伙计!

标签: java string list exception


【解决方案1】:

试试

       l.remove(Character.valueOf(ch));
       l.remove(Character.valueOf(Character.toLowerCase(ch)));

我的猜测是您的代码中使用了List.remove(int),其中 int 是列表中的索引。

堆栈跟踪将给出发生异常的正确行号。总是检查那个。

【讨论】:

    【解决方案2】:

    您也可以尝试将 2 个字符串转换为大写或小写,然后获取第二个字符串中每个字符的索引,如果不等于 -1,则将其删除

            String s1 = "lennon";
            String s2 = "Ln";
    
            s1 = s1.toLowerCase();
            s2 = s2.toLowerCase();
            List<Character> l = new ArrayList<>();
            for (int i = 0; i < s1.length(); i++) {
                l.add(s1.charAt(i));
            }
            char ch;
            for (int i = 0; i < s2.length(); i++) {
                ch = s2.charAt(i);
    
                while ((l.indexOf(ch)) != -1) {
                    l.remove(l.indexOf(ch));
                }
            }
            for (Character c : l) {
                System.out.printf("%c", c);
            }
    

    【讨论】:

      【解决方案3】:

      您的程序需要进行更多更改才能正常工作。不管怎样,试试下面的代码:

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              System.out.format("Enter 2 Strings, schmuck:%n");
              String s1=br.readLine();
              String s2=br.readLine();
              List<Character> l = new ArrayList<Character>();
              for(int i=0;i<s1.length();i++)
              {
                  l.add(s1.charAt(i));
              }
              char ch;
             for(int i=0;i<s2.length();i++)
             {
                 ch=s2.charAt(i);
      
                 while((l.indexOf(ch))!=-1 || (l.indexOf(Character.toLowerCase(ch)))!=-1)
                 {
                     if(Character.isUpperCase(ch))
                    l.remove(new Character(Character.toLowerCase(ch)));
                     l.remove(new Character(ch));
                 }
             }
             for(Character c : l)
                 {
                 System.out.printf("%c", c);
                 }
          }
      

      【讨论】:

        猜你喜欢
        • 2015-03-15
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2011-04-16
        相关资源
        最近更新 更多