Java Can';我不明白为什么会发生阵列索引边界外性感觉。我怎样才能删除它?

Java Can';我不明白为什么会发生阵列索引边界外性感觉。我怎样才能删除它?,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我已经回顾了许多与我的主题相关的问题,因为我能够理解这个异常是如何发生的,但不理解为什么我正在执行的代码中会发生这个异常。下面的类接受两个参数:包含训练面的目录路径和要分类的图像路径。这实际上不是我的代码,它是由Petter Christian Bjelland编写的。。。下面是代码 public class OpenCVFaceRecognizer { public static void main(String[] args) { String trainingDir

我已经回顾了许多与我的主题相关的问题,因为我能够理解这个异常是如何发生的,但不理解为什么我正在执行的代码中会发生这个异常。下面的类接受两个参数:包含训练面的目录路径和要分类的图像路径。这实际上不是我的代码,它是由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行
字符串trainingDir=args[0]

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

java OpenCVFaceRecognizer <pathToDirectory> <pathToImageToClassify>
java OpenCVFaceRecognizer
如果您使用的是Eclipse,那么有一种方法可以在运行代码时传递参数

查看另一个SO帖子:


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


对于命令行
java OpenCVFaceRecognizer

此代码需要命令行参数,由于您没有通过命令行参数,因此返回此错误

或从终端使用

java OpenCVFaceRecognizer <foldername>  <imagePath>
java OpenCVFaceRecognizer

args数组保存的项目数量与通过命令行传递给main方法的项目数量相同。例如,如果您这样启动程序:

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

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

请参阅不要使用不存在的索引。您似乎没有任何要查找的命令行参数。就像程序参数trainingImages jon_doe_1.png中的这样??是的。您的程序需要两个参数。所以,若您使用的是IDE,那个么您可以按照所附的屏幕截图提供它,或者若您使用的是终端来运行,那个么使用第二种方法