Java 如何修复此异常

Java 如何修复此异常,java,arraylist,java.util.scanner,indexoutofboundsexception,Java,Arraylist,Java.util.scanner,Indexoutofboundsexception,下面是我用来区分两个txt文件之间差异的代码。唯一的问题是,如果我不从arrayList中减去1,我会得到一个越界异常,所以现在它并不是对所有元素都运行,我该如何解决这个问题 import java.io.*; import java.util.*; public class myfilereader { public static void main (String[] args) throws java.io.IOException { int temp

下面是我用来区分两个txt文件之间差异的代码。唯一的问题是,如果我不从arrayList中减去1,我会得到一个越界异常,所以现在它并不是对所有元素都运行,我该如何解决这个问题

import java.io.*;
import java.util.*;

public class myfilereader
{
    public static void main (String[] args) throws java.io.IOException
    {

        int temp = 0;
        ArrayList<String> ArrayList1 = new ArrayList<String>();
        ArrayList<String> ArrayList2 = new ArrayList<String>();
        ArrayList<String> ArrayList3 = new ArrayList<String>();
        try
        {
            Scanner File1 = new Scanner(new File("/Users/Home/Desktop/File1.txt"));
            while (File1.hasNext())
            {
                ArrayList1.add(File1.next());
            }

            Scanner File2 = new Scanner(new File("/Users/Home/Desktop/File2.txt"));
            while (File2.hasNextLine())
            {
                ArrayList2.add(File2.next());
            }
        }
        catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }
        for (String ArrayList : ArrayList1) 
        {
            System.out.println("File 1: " + ArrayList1);
        }
        for (String ArrayList : ArrayList2) 
        {
            System.out.println("File 2: " + ArrayList2);
        }

        if(ArrayList1.size()>ArrayList2.size())
        {
            for(int i=0; i<ArrayList1.size()-1; i++)
            {
                if(ArrayList1.get(i).equals(ArrayList2.get(i)))
                {
                    temp++;
                }
            }
        }
        if(ArrayList2.size()>ArrayList1.size())
        {
            for(int i=0; i<ArrayList2.size()-1; i++)
            {
                if(ArrayList2.get(i).equals(ArrayList1.get(i)))
                {
                    temp++;
                }
            }
        }
        if(temp == 0)
        System.out.println("The files are the same.");
        else
            System.out.println("There are " + temp + " differences between the files");

    }
}
import java.io.*;
导入java.util.*;
公共类myfilereader
{
公共静态void main(字符串[]args)引发java.io.IOException
{
内部温度=0;
ArrayList ArrayList 1=新的ArrayList();
ArrayList ArrayList 2=新的ArrayList();
ArrayList ArrayList 3=新的ArrayList();
尝试
{
Scanner File1=新扫描仪(新文件(“/Users/Home/Desktop/File1.txt”);
while(File1.hasNext())
{
add(File1.next());
}
Scanner File2=新扫描仪(新文件(“/Users/Home/Desktop/File2.txt”);
while(File2.hasNextLine())
{
ArrayList2.add(File2.next());
}
}
捕获(FileNotFoundException ex)
{
例如printStackTrace();
}
for(字符串ArrayList:ArrayList 1)
{
System.out.println(“文件1:+ArrayList1”);
}
for(字符串ArrayList:ArrayList 2)
{
System.out.println(“文件2:+ArrayList2”);
}
if(ArrayList1.size()>ArrayList2.size())
{
对于(int i=0;iArrayList1.size())
{
对于(int i=0;i这就是问题所在:

    if(ArrayList1.size()>ArrayList2.size())
    {
    //ArrayList1 is bigger!!!!

        for(int i=0; i<ArrayList1.size()-1; i++)
        {
            if(ArrayList1.get(i).equals(ArrayList2.get(i)))
            // ArrayList2 does not contain as many elements as ArrayList1
            {
                temp++;
            }
        }
    }
if(ArrayList1.size()>ArrayList2.size())
{
//ArrayList 1更大!!!!

对于(int i=0;i ArrayList.size(),但请确保使用较短的列表作为循环的限制!:-)

或者,您可以替换:

for(int i=0; i<ArrayList1.size()-1; i++)
这称为for-each循环,可用于更可读的更简单的迭代

if(ArrayList1.size()>ArrayList2.size())
{
    for(int i=0; i<ArrayList1.size()-1; i++)
    {
        if(ArrayList1.get(i).equals(ArrayList2.get(i)))
        {
            temp++;
        }
    }
}

这可能不符合您的代码要求,但错误将消失。

正如Sara Seppola已经提到的,您需要使用两个大小中最小的一个来比较两个列表中的元素。目前,您使用的是两个列表中最大的一个,这保证了您将超出较小列表的范围

此外,您应该在循环限制中使用
ArrayList1.size()
而不是
ArrayList1.size()-1
,因为严格小于签入循环条件当前导致
i
0
迭代到
ArrayList1.size()-2
-这是一个太短的索引。同样,索引超出边界不是由
-1
引起的,而是因为在条件中使用了不正确的大小

最后,您没有考虑列表大小相等的情况。目前,您的代码给出“文件相同”,因为当
ArrayList1.size()==ArrayList2.size()
时,没有通过if测试


当然,您仍然可以简化代码。您可以使用
Math.min(ArrayList1.size(),ArrayList2.size())
获取两个大小中的最小值并删除重复的循环。您还可以使用
Math.abs(ArrayList1.size()-ArrayList2.size())
获取额外元素的数量,无论
ArrayList1
还是
ArrayList2
是最大的。我将把这作为读者的练习。;-

首先在代码中检查ArrayList2.size()>ArrayList1.size(),然后在0到ArrayList2.size()之间操作for循环因为ArrayList2更大,所以在点i中找不到ArrayList1中的最后一个元素!我认为for循环应该从0到ArrayList1.size()既然一个比另一个短,如果一个列表比另一个列表大,你怎么能期望用相同的索引在这两个列表中循环?还有,为什么不在完成读取后关闭文件?@antoh这不是问题。for条件是
i
,因此它会在
i==ArrayList1.size()之后立即停止-2
因为严格小于。正确的条件是
i
。实际问题是OP使用了错误的限制:他应该使用两种尺寸中最小的一种。此外,他可能应该在他的if测试中使用大于或等于。在这种情况下,您如何比较两个列表中的匹配元素?您需要对每个元素进行比较,因此需要使用
i
为两个列表编制索引。为True,但
-1
仍然错误。使用
Arraylist 2.size()-1
不会检查
Arraylist 2
中的最后一个元素。这是真的:)如果要遍历整个数组,则需要从0->Arraylist.size()就像我在代码之后已经提到的,非常感谢大家!!!我能够理解所有内容并以正确的方式编写代码
if(ArrayList1.size()>ArrayList2.size())
{
    for(int i=0; i<ArrayList1.size()-1; i++)
    {
        if(ArrayList1.get(i).equals(ArrayList2.get(i)))
        {
            temp++;
        }
    }
}
for(int i = 0; i < ArrayList2.size(); i++)
{
    ...
if(ArrayList1.size() >= ArrayList2.size())
{
    // Here, ArrayList1.size() >= ArrayList2.size()
    // Use the smallest size as limit so we stay in bounds for both
    // In this case, that's ArrayList2.size()
    // When the lists have equal length, both sizes could be used
    // as limit so it doesn't really matter whether you use
    // > or >= in the test of the above if-statement
    for(int i=0; i<ArrayList2.size(); i++)
    {
        if(ArrayList1.get(i).equals(ArrayList2.get(i)))
        {
            temp++;
        }
    }
}
else
{
    // Here, ArrayList1.size() < ArrayList2.size()
    // so use ArrayList1.size() as the limit
    for(int i=0; i<ArrayList2.size(); i++)
    {
        if(ArrayList2.get(i).equals(ArrayList1.get(i)))
        {
            temp++;
        }
    }
}
if(ArrayList1.size() >= ArrayList2.size())
{
    temp = ArrayList1.size() - ArrayList2.size();
    // [for loop]
}
else
{
    temp = ArrayList2.size() - ArrayList1.size();
    // [for loop]
}