java - repetir - Agregar números a un rango
numero entero aleatorio en java (1)
Estoy haciendo un programa donde puedo agregar una secuencia entera a un rango. Tengo problemas para agregar estos valores al Rango. Debería ejecutar el método addNodeAfter
, pero no hace nada.
Luego, cuando quiero mostrar el Rango, obtengo una NullPointerException
esta línea:
for (int i = 1; i <= manyNodes; i++){
¿Algun consejo?
Principal:
public class PDEMain {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a start number: ");
Integer startNum = input.nextInt();
System.out.print("Enter end number: ");
Integer endNum = input.nextInt();
System.out.print("Enter increment: ");
Integer increment = input.nextInt();
Range obj = new Range(startNum, endNum, increment);
System.out.println(obj);
obj.display();
}
}
Distancia:
public class Range implements Cloneable {
private Integer data; // holds the data
private Range link; //holds the link
Range head; //refers to head of linked list
private Integer manyNodes;
private Integer startValue;
private Integer endValue;
private Scanner input;
public Range(Integer data, Range link){
this.data = data;
this.link = link;
}
public Range(Integer data, Range link, Range head) {
this.data = data;
this.link = link;
this.head = head;
manyNodes++;
}
public Range(Integer start, Integer end,Integer increment){
if(start == null){
startValue = 0;
}
if(increment == null){
if(start < end){
increment++;
}else{
increment--;
}
}
for (int i = start; i <= end; i+= increment){
addNodeAfter(i);
System.out.println(i);
}
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Range getLink() {
return link;
}
public void setLink(Range link) {
this.link = link;
}
public Range getHead() {
return head;
}
public void setHead(Range head) {
this.head = head;
}
public void addNodeAfter(Integer element){
this.link = new Range(element, this.link);
}
public void display(){
Range cursor = head;
for (int i = 1; i <= manyNodes; i++){ // NPE on this line
System.out.print(cursor.getData() + " ");
cursor = cursor.getLink();
}
System.out.println("");
}
}
Ha definido manyNodes
como un Integer
, no como un int
. Esto significa que su valor predeterminado es null
, no 0
, y nunca establece el valor en ningún lugar de su código.
Cuando intente utilizar el bucle como la variable de control en su método display()
, la JVM lanzará un NPE cuando intente desempaquetar el null
.
Una solución rápida sería cambiar el tipo a int
:
private int manyNodes;
Esto resolverá el NPE inmediato, pero aún no mostrará nada, ya que en realidad nunca incrementa manyNodes
en el constructor al que está llamando. Esto significa que el for-loop en su método de display()
se cae y nunca imprime ninguno de los datos.
Recomendaría deshacerse por completo de head
y manyNodes
, y volver a escribir su método display()
largo de las líneas de:
public void display() {
Range cursor = getLink();
while (cursor != null) {
System.out.print(cursor.getData() + " ");
cursor = cursor.getLink();
}
System.out.println("");
}
Tenga en cuenta que esto generará los datos "hacia atrás" debido a la forma en que agrega cosas en este constructor:
public static void main(String[] args) throws Exception {
Range obj = new Range(1, 10, 1);
obj.display(); // prints 10 9 8 7 6 5 4 3 2 1
}
Es posible que desee echar un vistazo a una implementación de lista enlazada existente para tener una mejor idea de cómo se escriben normalmente.