Pages: [1]   Go Down
Print
Author Topic: Errore banale, ma non lo trovo  (Read 3129 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
sisal
Matricola
*
Offline Offline

Posts: 87



« on: 02-04-2009, 17:49:05 »

Ragazzi scusate ma, dato questo codice, sapreste dirmi perchè mi da l'errore del NullPointerException??
Grazie in anticipo!!

Code:
import javax.swing.*;
import java.io.*;
public class creazioneListe1
{
public static void main (String [] args)
{
int num=Integer.parseInt(JOptionPane.showInputDialog("Da quanti elementi vuoi che sia composta la tua Lista?"));
Nodo head=new Nodo(Integer.parseInt(JOptionPane.showInputDialog("Inserisci la testa della Lista: ")));
Lista l=new Lista(head);
Nodo aux=head;
for(int i=0;i<num;i++)
{
aux.setNext(new Nodo(Integer.parseInt(JOptionPane.showInputDialog("Inserisci il " + (i+1) + "° elemento della Lista: "))));
aux=aux.getNext();
}
l.visualizza();
}
}

class Lista{
private Nodo head;
int num;

public Lista(Nodo x){
head= x;
}

public boolean isEmpty(){//CONTROLLA SE LA LISTA E' VUOTA
return(head==null ? true : false);
}

public int numNodi()//RESTITUISCE IL NUMERO DI NODI
{
return head.getCont();
}

public void visualizza(){//VISUALIZZA LA LISTA
Nodo aux=head;
int c=numNodi();
while(c!=0){
c--;
System.out.println("Gli elementi della Lista sono: " + aux.getInfo());
aux=aux.getNext();
}

}

//INSERIMENTI
public void InsertHead(int val){
head=new Nodo(val,head);
}

public void InsertTail(int val){
if (isEmpty())
head=new Nodo(val);
else{
Nodo aux=head;
for(; aux.getNext() != null; aux=aux.getNext());
aux.setNext(new Nodo(val));
}
}

public void InsertOrdered(int val){
if(isEmpty())
head=new Nodo(val);
else
if(head.getInfo()>val)
head=new Nodo(val,head);
else{
Nodo aux=head;
for(; (aux.getNext() != null) && (aux.getNext()).getInfo()<val;);
aux.setNext(new Nodo(val,aux.getNext()));
}
}

//RICERCHE
public Nodo SearchOrd(int key){
Nodo aux=head;
for(; aux != null && aux.getInfo()<key; aux=aux.getNext());
if (aux != null && aux.getInfo() == key)
return aux;
return null;
}

public Nodo Search(int key){
Nodo aux=head;
for(; aux!=null && aux.getInfo() != key; aux=aux.getNext());
return aux;
}
}

class Nodo{

private int info;
//private Object info;
private Nodo next;
private static int cont;

public Nodo(int val){
this(val,null);
cont++;
}

public Nodo(int val, Nodo n){
info=val;
next=n;
cont++;
}

public static int getCont()
{
return cont;
}

public void setInfo(int val){
info=val;
}

public int getInfo(){
return info;
}

public void setNext (Nodo n){
next=n;
}

public Nodo getNext(){
return next;
}
}

Logged
corel_86
Forumista
***
Offline Offline

Gender: Male
Posts: 570



« Reply #1 on: 02-04-2009, 18:10:22 »

L'errore sta nella classe visualizza quando tu assegni aux=aux.getNext() l'ultimo elemento della lista sarà "null" quindi quando vai a stampare con l'istruzione

System.out.println("Gli elementi della Lista sono: " + aux.getInfo());


vai a stampare l'elemento aux che in quel momento punterà a "null"

secondo me dovresti fare un for dove la condizione e appunto aux.getNext() != null
Logged

Se trovo qualcosa che non va lo faccio presente subito

Saluti ciaociao ciao

A.C.
Zeridos
Forumista
***
Offline Offline

Gender: Male
Posts: 705


The Original


« Reply #2 on: 02-04-2009, 18:11:36 »

L'errore e' nel contatore c che usi nella visualizza, se provi a vare un output vedrai che c non da il numero reale dato che lo incrementi due volte:

Code:
public Nodo(int val){
this(val,null);
cont++; //<- qui
}

public Nodo(int val, Nodo n){
info=val;
next=n;
cont++; //<- qui
}

e quindi ti da in errore visto che non controlli se il getNext da un null ma ti basi solo sul contatore (cosa non proprio corretta a mio avviso )

Cmq ti basta commentare il primo incremento e il gioco e' fatto.

Ciauz

EDIT:
for o while e' indifferente, anzi while e' anche meglio dato che non ci servono altri contatori, basta modificare così:
while(aux!=null)
{...}
e togliere ogni riferimento al contatore che tanto non serve, quando finisce esce da solo perche' puntera' a null.
In ogni caso il contatore fatto in quel modo e' sbagliato e se lo usa per altro non funzionerebbe lo stesso

« Last Edit: 02-04-2009, 18:20:38 by Zeridos » Logged

I love penguins, dead ones...
sisal
Matricola
*
Offline Offline

Posts: 87



« Reply #3 on: 03-04-2009, 20:48:25 »

ok grazie ragazzi problema risolto 
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #4 on: 04-04-2009, 07:24:19 »

tutto si è risolto per il meglio
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Pages: [1]   Go Up
Print
Jump to: