无法理解为什么会发生ArrayIndexOutOfBoundsException。我该如何删除它?

时间:2016-09-03 07:23:24

标签: java indexoutofboundsexception

我已经回顾了很多与我的主题相关的问题,因为我能够理解如何发生此异常,但不明白为什么此异常正在发生在我执行的代码中。下面的类有两个参数:包含训练面的目录的路径以及要分类的图像的路径。这实际上不是我的代码,它是由Petter Christian Bjelland编写的......以下是代码

public class OpenCVFaceRecognizer {
    public static void main(String[] args) {
        String trainingDir = args[0];
        Object testImage = Highgui.imread(args[1], 0);

        File root = new File(trainingDir);
        FilenameFilter imgFilter = new FilenameFilter() {
            public boolean accept(File dir, String name) {
                name = name.toLowerCase();
                return name.endsWith(".jpg") || name.endsWith(".pgm") || name.endsWith(".png");
            }
        };
        File[] imageFiles = root.listFiles(imgFilter);
        MatVector images = new MatVector(imageFiles.length);
        Mat labels = new Mat(imageFiles.length, 1, CV_32SC1);
        IntBuffer labelsBuf = labels.createBuffer();
        int counter = 0;
        for (File image : imageFiles) {
            Object img = Highgui.imread(image.getAbsolutePath(), 0);
            int label = Integer.parseInt(image.getName().split("\\-")[0]);
            images.put(counter, (Mat) img);
            labelsBuf.put(counter, label);
            counter++;
        }
        FaceRecognizer faceRecognizer = createFisherFaceRecognizer();
        faceRecognizer.train(images, labels);
        int predictedLabel = faceRecognizer.predict((Mat) testImage);
        System.out.println("Predicted label: " + predictedLabel);
    }
}

以下是完整的例外

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at OpenCVFaceRecognizer.main(OpenCVFaceRecognizer.java:40)

这是第40行String trainingDir = args[0];

4 个答案:

答案 0 :(得分:0)

嗯,你需要在启动代码时实际传递这些参数

java OpenCVFaceRecognizer <pathToDirectory> <pathToImageToClassify>

如果您正在使用Eclipse,那么可以在运行代码时传递参数。

查看其他SO帖子:

Eclipse : how we take arguments for main when run

答案 1 :(得分:0)

由于ArrayIndexOutOfBoundsException是主方法字符串参数,它意味着在运行应用程序时,您需要将字符串数组作为命令行参数传递。如果您正在使用任何编辑器,则需要在编辑器的运行配置中设置运行时参数

用于命令行java OpenCVFaceRecognizer <pathToDirectory> <pathToImageToClassify>

答案 2 :(得分:0)

此代码期待命令行争论,因为您没有通过命令行争论,所以它返回此错误。

enter image description here

或从终端使用

java OpenCVFaceRecognizer <foldername>  <imagePath>

答案 3 :(得分:0)

args数组包含通过命令行传递给main方法的项目数。例如,如果你这样开始你的程序:

java OpenCVFaceRecognizer c:\data\images c:\data\tobeclassified.jpg

args将包含两个元素,“c:\ data \ images”和“c:\ data \ tobeclassified.jpg”。该异常表示该程序在没有命令行参数的情况下启动(因为索引0已经超出了允许索引的范围,这是数组为空时的情况)。