首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >charAt()调用中的StringIndexOutOfBoundsException

charAt()调用中的StringIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2015-11-07 09:21:52
回答 2查看 105关注 0票数 0

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

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

我似乎无法在不抛出错误的情况下满足这个要求,因为如果字符数少于行数,charAt()将读取null。谢谢你的帮助!

代码:

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

回答 2

Stack Overflow用户

发布于 2015-11-07 09:31:50

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

类似于if(line1.length() < i)

String.length()

票数 0
EN

Stack Overflow用户

发布于 2015-11-07 09:45:44

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

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

或者:

代码语言:javascript
复制
if (line1.length() != line2.length()) {
    work = false;
} else {
    work = true;
}

或者:

代码语言:javascript
复制
if (line1.length() == line2.length()) {
    work = true;
} else {
    work = false;
}

然后

代码语言:javascript
复制
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您的循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33578085

复制
相关文章

相似问题

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