对象数组点空

Object Array point null

我的 eYMethods class 有 2 个静态方法第一个是 writeUSB 用我的扫描仪填充我的对象数组和我想停止创建对象数组 if (sumMemory > 80) 并删除通过条件的对象。但是当我这样做时,我在 main class 中调用的第二个静态方法 showDocs 指向空原因示例:(如果我创建 2 个对象数组并且第一个覆盖 sumMemory 的条件,第二个对象数组等待我的 getters 一些值所以它指向 null )。我该如何解决?

package eymain;

public class eYMethods {

    static int writeUSB(ekpaideytikoYliko usb[]) {

        double sumMemory = 0 ;
        int noOfObjects = 0;
        for(int i = 0; i < usb.length; i++) {                  
            System.out.println("Δωσε fileName : ");
            String fileName = scannerUserInput.getString();
            System.out.println("Δωσε minutes : ");
            double minutes = scannerUserInput.getDouble();
            System.out.println("Δωσε memorySpace");
            double memorySpace = scannerUserInput.getDouble();
            System.out.println();
            ekpaideytikoYliko tempEkpaideytikoYliko = new ekpaideytikoYliko(fileName, minutes, memorySpace);
            usb[i] = tempEkpaideytikoYliko;
            noOfObjects++;
            sumMemory += memorySpace;
            if (sumMemory > 80) {  
                noOfObjects--;                
                System.out.println("OverLimit");
                break;               
            }
        }

        System.out.println("sumMemory : " + sumMemory);
        return noOfObjects;

    }
    static void showDocs(ekpaideytikoYliko usb[]) {

        for(int i =0; i < usb.length; i++) {
            System.out.println("fileName : " + usb[i].getFileName());
            System.out.println("minutes : " + usb[i].getMinutes());
            System.out.println("memorySpace : " + usb[i].getMemorySpace());
            System.out.println();
        }
    }
 }

如果我对你的理解是正确的,你试图找到一种方法在 sumMemory 大于 80 时不将 ekpaideytikoYliko tempEkpaideytikoYliko = new ekpaideytikoYliko(fileName, minutes, memorySpace); 添加到你的 usb 数组,如果是这样的话在检查 if sumMemory 小于或等于 80 后,您可以通过将 tempEkpaideytikoYliko 添加到数组来轻松地做到这一点:

static int writeUSB(ekpaideytikoYliko usb[]) {

        double sumMemory = 0 ;
        int noOfObjects = 0;
        for(int i = 0; i < usb.length; i++) {                  
            System.out.println("Δωσε fileName : ");
            String fileName = scannerUserInput.getString();
            System.out.println("Δωσε minutes : ");
            double minutes = scannerUserInput.getDouble();
            System.out.println("Δωσε memorySpace");
            double memorySpace = scannerUserInput.getDouble();
            System.out.println();

            sumMemory += memorySpace;
            if (sumMemory > 80) {                 
                System.out.println("OverLimit");
                break;               
            }else{
                ekpaideytikoYliko tempEkpaideytikoYliko = new ekpaideytikoYliko(fileName, minutes, memorySpace);
                usb[i] = tempEkpaideytikoYliko;
                noOfObjects++;
            }
        }

        System.out.println("sumMemory : " + sumMemory);
        return noOfObjects;

    }

好的,看起来问题是因为 usb[i]null 而你试图这样做:

 System.out.println("fileName : " + usb[i].getFileName());

这将尝试在 null 上调用一个方法并给你一个 NPE。

解决方案 #1:测试 null。

static void showDocs(ekpaideytikoYliko usb[]) {
    for (int i = 0; i < usb.length && usb[i] != null; i++) {
         ....
    }
}

解决方案 #2:传入并使用 noOfObjects

static void showDocs(ekpaideytikoYliko usb[], int noOfObjects) {
    for (int i = 0; i < usb.noOfObjects; i++) {
         ....
    }
}

解决方案 #3:使用 List<ekpaideytikoYliko> 而不是 ekpaideytikoYliko[]

这是最干净的,因为它也解决了另一个问题。如果使用 List,则不必预先分配 "large enough" 的数组,希望它是


风格。

根据Google翻译,"ekpaideytikoYliko"是两个字:大概是εκπαιδευτικ Υλικο,音译成罗马字。所以正确的class名字应该是:

  EkpaideytikoYliko

Class 名称应始终 以大写字母开头。

或一些变化