对象数组点空
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 名称应始终 以大写字母开头。
或一些变化
我的 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 名称应始终 以大写字母开头。
或一些变化