我尝试创建一个环形缓冲区。 当我尝试在第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中引发异常。在此处输入代码