是什么导致我得到NullPointerException? [重复]

问题描述 投票:-1回答:1

节点

class Node {
  int antMinne;
  int antProsessorer;

  public Node(int minne, int prosessor) {
    antMinne = minne;
    antProsessorer = prosessor;
  }

  public int antProsessorer() {
    return antProsessorer;
  }

  public boolean nokMinne(int paakrevdMinne) {
    if (paakrevdMinne <= antMinne) {
      return true;
    }
    else {
      return false;
    }
  }
}

机架

class Rack {
  public Node[] rack;
  private int noderPerRack;

  public Rack(int storrelse) {
    noderPerRack = storrelse;
    this.rack = new Node[storrelse];
  }

  public void settInn(Node node, int plass) {
    this.rack[plass] = node;
    }

  public int antNoder() {
    int sum = 0;
    for (int i = 0; i < noderPerRack; i++) {
      if (this.rack[i] != null) {
        sum ++;
      }
    }
    return sum;
  }

  public int antProsessorer() {
    int sumPros = 0;
    for (int i = 0; i < noderPerRack; i++) {
      sumPros = sumPros + this.rack[i].antProsessorer();
    }
    return sumPros;
  }

  public int noderMedNokMinne(int paakrevdMinne) {
    int sum = 0;
    for (int i = 0; i < noderPerRack; i++) {
      if (this.rack[i].nokMinne(paakrevdMinne) == true) {
        sum++;
      }
    }
    return sum;
  }
}

Class Dataklynge

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;

class Dataklynge {
  ArrayList<Rack> racks;
  Rack rack;
  int noderPerRack;
  ArrayList<Integer> antNoder;
  ArrayList<Integer> antProsessorer;
  ArrayList<Integer> minne;
  int e;

  public Dataklynge(String filnavn) throws IOException {
    File fil = new File(filnavn);
    racks = new ArrayList<Rack>();

    this.antNoder = new ArrayList<Integer>();
    this.minne = new ArrayList<Integer>();
    this.antProsessorer = new ArrayList<Integer>();

    Scanner scan = new Scanner(fil);
    //scan.useDelimiter(" ");
    noderPerRack = scan.nextInt();
    this.e = 0;

    while (scan.hasNextInt()) {
      this.antNoder.add(scan.nextInt());
      this.minne.add(scan.nextInt());
      this.antProsessorer.add(scan.nextInt());
      this.e++;
    }
    rack = new Rack(noderPerRack);
    racks.add(rack);
    scan.close();
  }

  public void settInnNode(Node node) {
    boolean opptatt = false;
    for (int i = 0; i < noderPerRack; i++) {
      if (rack.rack[i] != node) {
        rack.settInn(node, i);
        opptatt = true;
        break;
      }
    }
    if (opptatt == false) {
      Rack rack = new Rack(noderPerRack);
      racks.add(rack);
    }
  }

  public int antProsessorer() {
    int sumPros = 0;
    for (int i = 0; i < noderPerRack; i++) {
      sumPros += racks.get(i).antProsessorer();
    }
    return sumPros;
  }

  public int noderMedNokMinne(int paakrevdMinne) {
    int sum = 0;
    for (Rack rack : racks) {
      sum += rack.noderMedNokMinne(paakrevdMinne);
    }
    return sum;
  }

  public int antRacks() {
    return racks.size();
  }
}

Hovedprogram

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

class Hovedprogram {
  public static void main(String[] args) throws IOException {
    Dataklynge abel = new Dataklynge("dataklynge.txt");
    for (int j = 0; j < abel.e; j++) {
      for (int i = 0; i < abel.antNoder.get(j); i++) {
        abel.settInnNode(new Node(abel.minne.get(j), abel.antProsessorer.get(j)));
      }
    }
    System.out.println("Noder med minst 32 GB: " + abel.noderMedNokMinne(32));
    System.out.println("Noder med minst 62 GB: " + abel.noderMedNokMinne(64));
    System.out.println("Noder med minst 128 GB: " + abel.noderMedNokMinne(128));
    System.out.println("");
    System.out.println("Antall prosessorer: " + abel.antProsessorer());
    System.out.println("Antall rack: " + abel.antRacks());

Exception

Exception in thread "main" java.lang.NullPointerException
        at Rack.noderMedNokMinne(Rack.java:37)
        at Dataklynge.noderMedNokMinne(Dataklynge.java:65)
        at Hovedprogram.main(Hovedprogram.java:13)

编辑以希望澄清。我从某些方法中获取了NullPointerException,但还不知道那么多Java,因此似乎也无法弄清楚什么地方出了问题。它说异常来自noderMedNokMinne,但是当我测试其他方法时,我得到了相同的异常。我已经测试了Node和Rack,它们没有问题,因此错误必须在Dataklynge中。任务是创建一个由多个机架组成的Dataklynge,并且机架中具有一定数量的节点。非常感谢您的帮助!

java nullpointerexception
1个回答
0
投票

答案取决于输入文件(dataklynge.txt)或代码的用途。基本上是创建数组,像这样]

this.rack = new Node[storrelse];

但是您不必初始化所有事件,因此可以解决这样做或在访问数组之前进行检查的问题,像这样

public int antProsessorer() {
    int sumPros = 0;
    for (int i = 0; i < noderPerRack; i++) {
        if (this.rack[i] != null)
            sumPros = sumPros + this.rack[i].antProsessorer();
    }
    return sumPros;
}

public int noderMedNokMinne(int paakrevdMinne) {
    int sum = 0;
    for (int i = 0; i < noderPerRack; i++) {
        if (this.rack[i] != null && this.rack[i].nokMinne(paakrevdMinne) == true) {
            sum++;
        }
    }
    return sum;
}

...

public int antProsessorer() {
    int sumPros = 0;
    for (int i = 0; i < noderPerRack; i++) {
        if (i < racks.size() && racks.get(i) != null)
            sumPros += racks.get(i).antProsessorer();
    }
    return sumPros;
}

如果发布目标和意见,我可以告诉您哪种是修复代码的正确方法。

© www.soinside.com 2019 - 2024. All rights reserved.