Java Process Builder递增错误

Java Process Builder递增错误,java,linux,command-line,Java,Linux,Command Line,我已经编写了一个程序来监视Linux上连接到RAID的一些硬盘的状态。通过这个程序,我执行几个命令行命令。然而,发生了一个有趣的错误……程序运行了整整三分钟,之后似乎无法再正确执行它以前执行过的命令(多次迭代) 它抛出了一个数组索引错误(我的变量driveLetters[d]),因为它似乎不知何故错过了驱动器(尽管它以前发现过数百次) 其他需要注意的事情…如果我告诉它在超过驱动器数量时将int“d”重置为“0”…程序不会崩溃,而是陷入无限循环。 此外,程序崩溃的时间也会有所不同。经过一定的时间间

我已经编写了一个程序来监视Linux上连接到RAID的一些硬盘的状态。通过这个程序,我执行几个命令行命令。然而,发生了一个有趣的错误……程序运行了整整三分钟,之后似乎无法再正确执行它以前执行过的命令(多次迭代)

它抛出了一个数组索引错误(我的变量driveLetters[d]),因为它似乎不知何故错过了驱动器(尽管它以前发现过数百次)

其他需要注意的事情…如果我告诉它在超过驱动器数量时将int“d”重置为“0”…程序不会崩溃,而是陷入无限循环。 此外,程序崩溃的时间也会有所不同。经过一定的时间间隔后,它似乎不会崩溃。最后,我没有得到任何类型的内存泄漏错误

下面是一些应该显示错误的代码:

public static void scsi_generic() throws IOException, InterruptedException
{
    int i =0;
    int d =0;

    int numberOfDrives = 8;

    char driveLetters[] = {'b','c','d','e','f','g','h','i','j','k','l','m'};

    String drive = "";

    while (i <= numberOfDrives)
    {
        System.out.println("position 1");
        List<String> commands = new ArrayList<String>();
        commands.add("cat");
        commands.add("/sys/class/scsi_generic/sg"+i+"/device/sas_address");


        SystemCommandExecutor commandExecutor = new SystemCommandExecutor(commands);
        int driveFound = commandExecutor.executeCommand();


        if (driveFound == 0)
        {
            System.out.println("Folder: sg" + i + " was found." );
            StringBuilder stdout = commandExecutor.getStandardOutputFromCommand();
            String data = stdout.toString();
            String sas = data.substring(11,12);
            int sasA = Integer.parseInt(sas,16);


            boolean matchedSG = false;

            while (matchedSG == false)
            {
                System.out.println("position2");      
                List<String> lookSD = new ArrayList<String>();
                lookSD.add("test");
                lookSD.add("-d");
                lookSD.add("/sys/class/scsi_generic/sg"+i+"/device/block:sd" + driveLetters[d]);
                SystemCommandExecutor commandSearch = new SystemCommandExecutor(lookSD);
                int sdFound = commandSearch.executeCommand();
                StringBuilder stdout3 = commandSearch.getStandardOutputFromCommand();
                StringBuilder stderr = commandSearch.getStandardErrorFromCommand();
                String sdFound2 = stdout3.toString();

                if (sdFound == 0)
                {
                    matchedSG = true;
                    System.out.println("Found the SD drive.");
                    drive = "sd"+driveLetters[d];
                    System.out.println(sasA);
                    hdsas.set(sasA , sas);
                    d = 0;
                    i++;
                    loadDrives(drive , sasA);
                }
             /*   else if (sdFound != )
                {
                    System.out.println("Error:" + sdFound);
                    System.out.println(d+  " "+ i);   
                }
                */
                else if ( d >= 8)
                {
                    System.out.println("Drive letter: " + driveLetters[d]);
                    System.out.println("Int: " + i);
                    // System.out.println(sdFound2);
                    System.out.println("sd error: "+ sdFound);
                    // System.out.println(stderr);
                    //System.out.println(sdFound2 + " m");
                }
                else 
                {
                    d++;
                }
            }
        }
        else 
        {
            System.out.println("Folder: sg" + i + " could not be found.");
            i++;
        }

        d =0;
    }
 }

不知道它为什么能工作并且不会崩溃,就像linux命令行在短时间后所做的那样,但它确实会崩溃。

这并不是对您问题的直接回答,但它仍然可以帮助您:

我经常不得不在像您这样的代码中发现bug(带有“全局”变量的非常长的方法,即在方法开始时声明的变量,然后在整个过程中使用)。只要正确地重构代码(每个方法都有一个目的的简短方法),我就能立即看到错误的原因,并在一秒钟内修复(而重构本身需要更长的时间)


我想这正是每个试图为你提供帮助的人都在做的事情:重构你的代码(可能只是在一个人的头脑中),以便(更)容易理解正在发生的事情。

我找到的解决方案是使用java库来测试目录是否存在,而不是通过linux命令行进行测试

例:


不知道它为什么工作并且没有崩溃,正如linux命令行在短时间后所做的那样,但它确实崩溃了。

请清理您发布的代码的缩进以使其可读。当出现异常时是否打印了
d
?是的,打印了d。在得到数组越界异常之前,它总是以数组可能达到的最大值结束。不知道为什么它会起作用。我设法解决了我的问题。不幸的是,stackoverflow不允许我再发布6个小时的解决方案。一旦时间限制到了,我就会发布解决方案,现在我正在编辑我的帖子。谢谢
File location = new File("directory");
if (location.exists())
{

}
File location = new File("directory");
if (location.exists())
{

}