0

我正在尝试读取图像文件的数量,并且想将它们相互比较。我创建了一个大小为 5 的数组对象并为其分配了 5 个图像。我试图通过将数组对象传递给方法来比较每个图像。但它向我显示了一个错误。谁能帮我?

File[] f= new File[5];

 f[1]= new File("p1.png");

 f[2]= new File("p2.png");

 f[3]= new File("p3.png");

 f[4]= new File("p4.png");

 f[5]=new file("p5.png");

 for(int i=1;i<5;i++)

{

 compare(f[i],f[i++]);

}

public void compare(File fi[1],File fi[2])
{


    BufferedImage image = ImageIO.read(fi[1]);
 int width = image.getWidth(null);

  int height = image.getHeight(null);

int[][] clr=  new int[width][height]; 

  BufferedImage images = ImageIO.read(fi[2]);

 int widthe = images.getWidth(null);

   int heighte = images.getHeight(null);

int[][] clre=  new int[widthe][heighte]; 
}
4

8 回答 8

2

几个问题:

  1. 这条线

    public void compare(File fi[1],File fi[2])
    

    是语法错误。它应该是

    public void compare(File f1, File f2)
    

    (显然,参数的名称取决于您)。

  2. 调用它时,使用

    compare(f[i], f[i + 1]);
    

    而不是i++.

  3. 此行尝试写入不存在的数组槽:

     f[5]=new file("p5.png");
    

    ...因为您的数组被定义为new File[5],这意味着它有插槽0通过4。您需要将插槽中的所有行设置值更改为使用0through4而不是1through 5

  4. 你的循环边界是错误的。它们应该是0and< f.length - 1而不是1and< 5在这里:

    for(int i = 0; i < f.length - 1; i++)
    

    < f.length - 1做而不是做有两个原因< 5。首先,因为你i + 1在循环体中使用,你想提前停止一个槽。其次,如果你改变了之后的长度f,你必须记得更新循环5for这是一个等待发生的维护问题。(请注意,循环是 toi < f.length - 1因为您i + 1在循环主体中使用。通常循环是0through < length,但在这种情况下不是。)

那时我停止阅读代码,所以不能保证没有其他基本问题。我建议阅读一些基本的 Java 教程。

于 2013-03-16T09:51:20.777 回答
0

你的意思是互相比较?

for (int i = 0; i < f.length; i++)
    {
        for(int j=i+1;j<f.length;j++){
         compare(f[i], f[j]);
        }
    }
于 2013-03-16T09:55:10.883 回答
0

数组从 0 开始索引,而不是 1。而不是这样:

File[] f= new File[5];
 f[1]= new File("p1.png");
 f[2]= new File("p2.png");
 f[3]= new File("p3.png");
 f[4]= new File("p4.png");
 f[5]=new file("p5.png");

用这个:

File[] f= new File[5];
 f[0]= new File("p1.png");
 f[1]= new File("p2.png");
 f[2]= new File("p3.png");
 f[3]= new File("p4.png");
 f[4]=new file("p5.png");
于 2013-03-16T09:50:51.263 回答
0

将您的方法签名更改为

public void compare(File fi1,File f2)
于 2013-03-16T09:50:52.937 回答
0

您的代码存在一些问题。

首先,你的 for 循环应该使用退出条件i < f.length-1

其次,您的比较方法不需要数组引用:

public void compare(File f1, File f2) {
    ....
}

第三,索引从 0 开始,而不是 1。

于 2013-03-16T09:51:04.143 回答
0

更改此行

public void compare(File fi[1],File fi[2]){

public void compare(File fi,File fi2) {

或者

public void compare(File[] fi,File[] fi2) {

于 2013-03-16T09:51:12.357 回答
0

大小为 5 的数组从 0-4 开始,但您访问的索引为 5

File[] f= new File[5];

 f[1]= new File("p1.png");

 f[2]= new File("p2.png");

 f[3]= new File("p3.png");

 f[4]= new File("p4.png");

 f[5]=new file("p5.png");  // This is wrong 

值应为 0-4

并且

 for(int i=1;i<5;i++)
{
 compare(f[i],f[i++]);  

如果 i==4 那么 i++ 会变成,所以你会得到 ArrayIndexOutOfBoundsException

 }

我不会提及其余的错误,因为其余的答案已经发布了

于 2013-03-16T09:52:37.423 回答
-1
    File[] f= new File[6];

     f[1]= new File("p1.png");

     f[2]= new File("p2.png");

     f[3]= new File("p3.png");

     f[4]= new File("p4.png");

     f[5]=new file("p5.png");

     for(int i=1;i<5;i++)  
    {   
     compare(f[i],f[i+1]);
    }

    public void compare(File f1,File f2)
    {
     BufferedImage image = ImageIO.read(f1);
     BufferedImage image = ImageIO.read(f2);
 // compare as you like

}
于 2013-03-16T10:01:01.703 回答