线程异常 "main" java.lang.StringIndexOutOfBoundsException

Exception in thread "main" java.lang.StringIndexOutOfBoundsException

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7
    at java.lang.String.charAt(Unknown Source)
    at DNAmatch.findFirstMatchingPosition(DNAmatch.java:100)
    at DNAmatch.run(DNAmatch.java:82)
    at acm.program.Program.runHook(Program.java:1568)
    at acm.program.Program.startRun(Program.java:1557)
    at acm.program.Program.start(Program.java:808)
    at acm.program.Program.start(Program.java:1279)
    at acm.program.Program.main(Program.java:1360)

我遇到了这个奇怪的错误,我不知道是什么原因造成的。我在谷歌上搜索了我的问题的解决方案,但没有任何帮助我解决它。 如果您尝试作为 chain1 atcg 和 chain2 tagaagtc 的输入,它工作正常 但是对于输入 chain1 atcg 和 chain2 tagaagct 然后我得到了这个错误。 如果有人能提供帮助,我将不胜感激。

============================================= ====

import acm.program.*;

public class DNAmatch extends Program
{
public void run()
{
    //The chains must only contain the characters A,T,C or G so we check the string for any irregularities.
    String current, chain2; Boolean flag=true; int errorCount;
    String chain1 = readLine("Please type in the first chain of DNA code: ");
    for (int i=0; i<chain1.length(); i++)
    {
        current = chain1.charAt(i) +"";
        if (!((current.equalsIgnoreCase("a"))||(current.equalsIgnoreCase("t"))||
                (current.equalsIgnoreCase("c"))||(current.equalsIgnoreCase("g"))))
        {
            flag=false; break;
        }
    }
    while (flag==false)
    {
        errorCount=0;
        println("The DNA code you insert must only contain the characters A, T, C and G");
        chain1 = readLine("Please type again in the first chain of DNA code: ");

        for (int i=0; i<chain1.length(); i++)
        {
            current=chain1.charAt(i) +"";
            if (!((current.equalsIgnoreCase("a"))||(current.equalsIgnoreCase("t"))||
                (current.equalsIgnoreCase("c"))||(current.equalsIgnoreCase("g"))))
            {
                errorCount =1; break;
            }
        }
        if (errorCount==0)
        {
            flag=true; break;
        }

    }
    chain2 = readLine("Please type in the second chain of DNA code: ");
    flag=true;
    for (int i=0; i<chain2.length(); i++)
    {
        current = chain2.charAt(i) +"";
        if (!((current.equalsIgnoreCase("a"))||(current.equalsIgnoreCase("t"))||
                (current.equalsIgnoreCase("c"))||(current.equalsIgnoreCase("g")))&&(chain1.length()>chain2.length()))
        {
            flag= false; break;
        }
    }

    while ((flag==false)&&(chain1.length()>chain2.length()))
    {
        errorCount=0;
        if (chain1.length()>chain2.length())
            println("The second DNA chain must be longer or equal to the first one at the most!");
        else
            println("The DNA code you insert must only contain the characters A, T, C and G");
        chain2 = readLine("Please type again the second chain of DNA code: ");
        for (int i=0; i<chain2.length(); i++)
        {
            current = chain2.charAt(i) +"";
            if (!((current.equalsIgnoreCase("a"))||(current.equalsIgnoreCase("t"))||
                    (current.equalsIgnoreCase("c"))||(current.equalsIgnoreCase("g")))&&(chain1.length()>chain2.length()))
            {
                errorCount =1; break;
            }
        }
        if (errorCount==0)
        {
            flag=true;
        }
    }

    int match=findFirstMatchingPosition(chain1,chain2);
    if (match==-1)
        println("Not match found! "+ match);
    else
        println("Match has been found at point "+ match+ "!");

}
public int findFirstMatchingPosition(String shortDNA, String longDNA)
{
    String currentCharShort=""; String currentCharLong="";
    int match=0; int ans=-1; int a;
    for (int i=0; i < longDNA.length(); i++)
    {
        a = i;
        match = 0;

        for (int j=0; j < shortDNA.length(); j++)
        {
            currentCharLong=longDNA.charAt(a)+ "";
            currentCharShort=shortDNA.charAt(j)+ ""; 

            if ( (currentCharShort.equalsIgnoreCase("a") && currentCharLong.equalsIgnoreCase("t"))||
                (currentCharShort.equalsIgnoreCase("t") && currentCharLong.equalsIgnoreCase("a"))||
                (currentCharShort.equalsIgnoreCase("c") && currentCharLong.equalsIgnoreCase("g"))||
                (currentCharShort.equalsIgnoreCase("g") && currentCharLong.equalsIgnoreCase("c")) )
            {
                match +=1;
                a +=1;
            }
            else break;
        }
        if (match == shortDNA.length())
        {
            ans=i;
            break;
        }

    }
    return ans;
}

}

if ( (currentCharShort.equalsIgnoreCase("a") && currentCharLong.equalsIgnoreCase("t"))||
            (currentCharShort.equalsIgnoreCase("t") && currentCharLong.equalsIgnoreCase("a"))||
            (currentCharShort.equalsIgnoreCase("c") && currentCharLong.equalsIgnoreCase("g"))||
            (currentCharShort.equalsIgnoreCase("g") && currentCharLong.equalsIgnoreCase("c")) )
        {
            match +=1;
            a +=1;
        }

这就是你的问题所在,因为你嵌套了循环,'a'有机会增加大于 longDNA 的总长度。

当你进入这个for循环时

for (int j=0; j < shortDNA.length(); j++)
    {
        currentCharLong=longDNA.charAt(a)+ "";
        currentCharShort=shortDNA.charAt(j)+ ""; 

        if ( (currentCharShort.equalsIgnoreCase("a") && currentCharLong.equalsIgnoreCase("t"))||
            (currentCharShort.equalsIgnoreCase("t") && currentCharLong.equalsIgnoreCase("a"))||
            (currentCharShort.equalsIgnoreCase("c") && currentCharLong.equalsIgnoreCase("g"))||
            (currentCharShort.equalsIgnoreCase("g") && currentCharLong.equalsIgnoreCase("c")) )
        {
            match +=1;
            a +=1;
        }
        else break;
    }

with "a" 这是 longDNA 中最后一个字符的索引(如果 longDNA 有六个字符,则为 5),当您输入 if 分支并放置 a+=1 时,您现在有一个更大的索引比 longDNA 大小。因此,当您再次迭代并搜索 charAt(a) 时,将抛出异常。如果您在内部 for 循环中不同时间执行 a+=1 语句,则 lesser "a" 也可能发生这种情况。