【问题标题】:StringIndexOutOfBoundsException in charAt() callcharAt() 调用中的 StringIndexOutOfBoundsException
【发布时间】:2016-02-08 06:24:01
【问题描述】:

我是编码新手,我正在尝试制作一个匹配两个文本文件的程序。对于第一行,我匹配第一个字符,第二行匹配两个字符,依此类推,直到其中一个文件结束。

这就是问题所在。如果该行没有足够的字符,您只比较存在的字符,如果两行 99 都有"abc",那么它将被视为匹配。

如果不引发错误,我似乎无法满足此要求,因为如果字符数少于行数,charAt() 正在读取 null。谢谢您的帮助!

代码:

public static void main(String[] args) throws IOException
{
    boolean flag;
    File f = new File(args[0]);
    Scanner sc = new Scanner(f);
    File f2 = new File(args[1]);
    Scanner sc2 = new Scanner(f2);
    int line = 1;
    String t1 = "";
    String t2 = "";
    String work = "";

    while(sc.hasNext() && sc2.hasNext())
    {
        String line1 = sc.nextLine().toUpperCase();
        String line2 = sc2.nextLine().toUpperCase();
        line1 = line1.trim();
        line2 = line2.trim();
        for(int i = 0; i < line; i++)
        {
            if(line1.charAt(i) != line2.charAt(i))
            {
                work = "no";
                t1 = Character.toString(line1.charAt(i));
                t2 = Character.toString(line2.charAt(i));
            }
            else
            {
                work = "";
                t1 = Character.toString(line1.charAt(i));
                t2 = Character.toString(line2.charAt(i));
            }
        }
        if(work == "")
        {
            System.out.println("Line # " + line + ": Matching " + line + " character/s true " + "**" + line1 + "**" + " and " + "**" + line1 + "**");

        }
        else
        {
            System.out.println("Line # " + line + ": Matching " + line + " character/s false " + "**" + line1 + "**" + " and " + "**" + line2 + "**");
        }
        line += 1;
    }
}

【问题讨论】:

  • 不要if(line1.charAt(i) != line2.charAt(i)),使用if(line1.charAt(i).equals(line2.charAt(i)))
  • use equals() to compare。 @Sekula1991 它是原始类型。所以 == 很好
  • 你要检查charAt()的结果是否为null,然后进行相应的处理

标签: java file char indexoutofboundsexception


【解决方案1】:

您需要检查 line1 和 line2 与 i 变量的长度,然后再在该行最后一个字母的末尾调用 char 。

类似 if(line1.length()

String.length()

【讨论】:

    【解决方案2】:

    第一次检查两行是否长度相等,如下所示(并将变量work 更改为boolean 而不是String)。它有助于提高性能,因为 boolean 占用 1 个字节,而 String 更多。

    if (line1.length() > line2.length()) {
        work = false;
    } else if (line1.length() < line2.length()) {
        work = false;
    } else if (line1.charAt(i) != line2.charAt(i)) {
        work = false;
    } else {
        work = true;
    }
    

    或者:

    if (line1.length() != line2.length()) {
        work = false;
    } else {
        work = true;
    }
    

    或者:

    if (line1.length() == line2.length()) {
        work = true;
    } else {
        work = false;
    }
    

    然后

    if(work) {//This is the same as if (work == true)
        System.out.println("Line # " + line + ": Matching " + line + " character/s true " + "**" + line1 + "**" + " and " + "**" + line1 + "**");
    } else {
        System.out.println("Line # " + line + ": Matching " + line + " character/s false " + "**" + line1 + "**" + " and " + "**" + line2 + "**");
    }
    

    但是如果你真的想要/需要使用work 变量作为String,那么不要将它与== 比较,而是work.equals("")"".equals(work)(第二个阻止NullPointerException

    阅读有关.equals()Java == vs equals()How do I compare Strings in Java 的更多信息。还有关于"".equals(variable) vs variable.equals("")

    如果在任何位置两行在任何字母处都不匹配,您可能还需要breakcontinue 循环。

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多