如何为数组对象修复NullPointerException

时间:2019-07-12 19:22:17

标签: java nullpointerexception

我尝试创建一个环形缓冲区。 当我尝试在第95行调用“ add”方法时,始终会收到NullPointException。 它似乎在阵列上。 该数组必须在默认构造函数中初始化。 现在我的问题是我没有正确初始化数组,或者为什么我收到此错误。谢谢您的帮助。

我已经尝试将其创建为对象:“ Ring [] data = new Ring [5]”。因此,我收到了错误消息:“ int无法隐蔽地响起”。因为“ t”作为实用程序变量传递,所以方法为“ add”。 错误:在Ring.add(Ring.java.95),在RingTest.main(RingTest.java:14) 那是我的戒指课:

/**
  *
  * Beschreibung Ein Ringspeicher (kurz ”Ring“) ist eine Datenstruktur, die (ähnlich wie Sequenzen) zur Kollektion von Elementen aus einem Grundbereich dient
  *
  * @version 1.0 vom 03.07.2019
  * @author inowikow(n) 
  */
import java.util.List; 
import java.util.ArrayList;
public class Ring {
  //Attribute
  protected int[] data;
  protected int size;
  protected int head;
  protected int first_place;

  //Default-Constructor
  public Ring(){
    Ring[] data = new Ring[size]; //Größe des Rings wird auf acht gesetzt   
    this.size = 6; //Größe wird auf null gesetzt
    this.first_place = 1; //Wird auf null gesetzt
    this.head = 1;
  }//end of defaul-Konstruktor

  //parameterized-Constructor
  public Ring(int cap){
    this.size = cap;
    try { //Innerhalb des try-Blockes wird die gewünschte Anweisung formuliert, die ggf. zu Fehlern führen kann
      if (cap < 0) { // Falls cap kleiner als null ist, also negativ wird eine exception geworfen
        throw new IllegalArgumentException("Der Wert darf nicht negativ sein!");   //Fehler wird abgefangen und wird direkt an den catch-block weitergeben
      } // end of if
    } catch(IllegalArgumentException e) { //Abfangen des Fehles und Ausgabe an den User
      System.out.println("IllegalArgumentException"); //Ausgabe des Fehlers
    } //end of try
  }//end of Parametesierter-Konstruktor

  //Verwaltungsmethoden
  //Getter und setter für size, getter lesen den Wert aus dem Attrebut und Setter können einen Wert in das Attribut setzen, diesem also einen Wert zuweisen
  protected void setSize(int size){
    this.size = size;
  }//end of setSize
  protected int getSize(){
    return this.size;
  }//end of getSize
  //Getter und Setter für head
  protected void setHead(int head){
    this.head = head;
  }//end of setHead
  protected int getHead(){
    return this.head;
  }//end of getHead
  //Getter und Setter für first_place
  protected void setFirst_place(int first_place){
    this.first_place = first_place;
  }//end of setFirst_place  
  protected int getFirst_place(){
    return this.first_place;
  }//end of getFirst_place

  //Anwendungsmthoden
  //Gibt Auskunft uber die Anzahl der Elemente im Ring
  public int size(){
    return this.size; //rückgabe this.size
  }//end of size

  //Gibt Auskunft uber die Kapazität des Rings
  /*public int capacity(){
  String value = ""; //Hilfsvariable, zum zwischenspeichern des Arraywertes
  for (int i = 0; i < data.length; i++ ) {
  value += data[i]; //Speichert das Array in einen String ab
  } // end of for
  int int_Data = Integer.parseInt(value); //Wandelt den String in einen Integerwert um
  return int_Data; //Rückgabe des Arraywertes als Int
  }//end of capacity */

  //Überprüft ob der buffer frei ist
  public boolean isBufferFree(){
    if (this.first_place < this.size) {
      return true;
    } // end of if
    else {
      return false;
    } // end of if-else
  }//end of isBufferFree

  //Fügt das neue Element t links vom aktuellen Element ein
  public void add(int t){
    if (this.first_place == 0) {
      if (data != null) {
        data[this.head] = t;     //Ist immer null, wenn du das also außerhablb dieser if-verzweigung packst, bekommst du eine Nullexecption
        this.size ++;
        this.first_place ++; 
      } // end of if

      data[this.head] = t;     //Nullexecption!!!!!!!!!!!!!!!!
      this.size ++;
      this.first_place ++;

    } // end of if
    else if(this.first_place > 0){
      if (isBufferFree()) {
        if (this.head == this.size ) {
          head = 0;
        } // end of if
        data[head] = t;
        this.head ++;
        this.first_place ++;
      } // end of if
      else {
        throw new IllegalArgumentException("Der Buffer ist voll"); 
      } // end of if-else
    } // end of if-else
  }//end of add


}//end of Ring

那是我的RingTest课:

  public static void main(String[] args) {
    //Erstellung von Objekten
    Ring buff = new Ring(8);
    buff.add(1);
    //Ausgabe der Objekte 
    System.out.println("Anzahl der Elemente im Ring:" + buff.size());

  } // end of main

该函数应在缓冲区中添加一个项目。因此,如果要打印元素数量,则缓冲区中应该有一个元素。但是问题是,如果我忘记在此数组中保存某些内容,则输出将在线程“ main” java.lang.NullPointerException中引发异常。在此处输入代码

0 个答案:

没有答案