我正在开发一个计算像素及其RGB的程序。 我正在尝试将这些值插入二维数组,但是在循环一遍后,程序将引发异常。 为什么会这样?
当我注释掉循环中的数组行时,它不会中断。
package imaging;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Imaging3 {
BufferedImage image;
int width, heigth, test;
int i, j;
int[][] hor = new int[i][j];
public Imaging3(){
try {
File input = new File("img1.png");
image = ImageIO.read(input);
width = image.getWidth();
heigth = image.getHeight();
int count = 0;
System.out.println("Horizontal scan: ");
for (i = 0; i < heigth; i++){
for (j = 0; j < width; j++){
count++;
Color c = new Color(image.getRGB(j, i));
System.out.println("nr " + count + "| " + c.getRed() + " " + c.getGreen() + " " + c.getBlue());
hor[i][j] = c.getRed();
}
}
}catch (Exception e) {
System.out.println("Program over");
}
}
static public void main(String args[]) throws Exception{
Imaging3 obj = new Imaging3();
}
}
答案 0 :(得分:0)
您的代码的问题是,当您在此处初始化数组时:
int i, j=0;
int[][] hor = new int[0][0];
这可以理解为:
width = image.getWidth();
height= image.getHeight();
int[][] hor = new int[height][width];
int的默认值为0,因此基本上可以创建空的二维数组。当您尝试插入值时,它将引发异常。
要解决此问题,请在您已经知道高度和宽度的代码中移动数组的初始化。
{{1}}
并在顶部删除这些i,j。您不需要它们;)仅为循环定义它们。一个好的做法是在需要的地方而不是在类级别定义变量。
答案 1 :(得分:0)
由于您已将i和j定义为类属性,因此它们的默认值为0。因此,下面的代码行为两个维度生成了大小分别为0和0的数组:
int[][] hor = new int[i][j];
在读取图像的宽度和高度之后,立即从属性直接实例化和新数组中移除数组的实例化,如下所示:
public class Imaging3 {
BufferedImage image;
int test;
int[][] hor;
public Imaging3(){
try {
File input = new File("img1.png");
image = ImageIO.read(input);
int width = image.getWidth();
int heigth = image.getHeight();
hor = new int[height][width];
int count = 0;
System.out.println("Horizontal scan: ");
for (int i = 0; i < heigth; i++){
for (int j = 0; j < width; j++){
count++;
Color c = new Color(image.getRGB(j, i));
System.out.println("nr " + count + "| " + c.getRed() + " " + c.getGreen() + " " + c.getBlue());
hor[i][j] = c.getRed();
}
}
}catch (Exception e) {
System.out.println("Program over");
}
}
static public void main(String args[]) throws Exception{
Imaging3 obj = new Imaging3();
}
}
答案 2 :(得分:0)
您尚未为i和j分配值,因此它们为零,即int类型的默认值。然后数组hor变为0 * 0数组。