Java.lang.NullPointerException ogni volta :(

di il
2 risposte

Java.lang.NullPointerException ogni volta :(

Ciao a tutti, sono alle prime armi con la programmazione in java..e tra un po' proverò a sostenere l'esame. all'università.. Programmare non mi è mai piaciuto, ma bisogna farlo..Il programma che posto qui è quindi, probabilmente, per molti di voi molto semplice..supera la fase di compilazione ma mi dà poi un errore in esecuzione..Potreste aiutarmi a risolvere il problema? Grazie



import java.util.Scanner;

interface CO
{ int size();
boolean isEmpty();
void enqueue(Comparable x);
Comparable dequeue();
void sort();
}

class MyCO implements CO
{ private Comparable[] v ;
private int vsize;
private int primo;
private int ultimo;

public MyCO()
{ Comparable[] v = new Comparable[1];
vsize = 0;
primo = 0;
ultimo = v.length-1;
}

public int size()
{ return vsize; }

public boolean isEmpty()
{ return (vsize==0); }

public void enqueue(Comparable x)
{ if ( x == null)
throw new IllegalArgumentException();
Comparable[] newv = new Comparable[vsize*2];
if (vsize == v.length) RIGA 34
System.arraycopy(v, 0, newv, 0, vsize);
newv = v;
v[ultimo] = x;
ultimo++;
vsize++;
}

public Comparable dequeue()
{ if (vsize == 0)
throw new IllegalArgumentException();
Comparable rem = v[primo];
vsize--;
return rem;
}

public void sort()
{ Comparable[] t = new Comparable[vsize];
for ( int i = 0; i<v.length; i++)
{ int minimo = i;
for ( int j = i+1; j<v.length; j++)
if (v[minimo].compareTo(v[j]) >0)
minimo = j;
Comparable temp = v[minimo];
v[minimo] = v;
v = temp;
}
}
}

/* Scrivere una classe Main.java di prova che:
– crei due esemplari della classe MiaCO di nome uno e due
– legga dall'ingresso standard una sequenza di numeri interi
in ordine casuale (un dato per riga), li
inserisca sia nella coda uno che nella coda due. Esegua 5 (cinque)
operazioni di dequeue() sulla coda uno, ordini la coda e la vuoti
trasferendone il contenuto sull'uscita standard (un dato per riga, i dati d
ovranno risultare ordinati), trasferisca sull'uscita standard una riga vuota
e vuoti la coda due trasferendo i dati sull'uscita standard, uno per riga.
In questo caso i dati in uscita dovranno essere nello stesso ordine dei dati in ingresso
*/


public class Main
{ public static void main (String[] args)
{ MyCO uno = new MyCO();
MyCO due = new MyCO();
Scanner c = new Scanner (System.in);
while (c.hasNext())
{ Integer w = new Integer(c.nextLine());
uno.enqueue(w); RIGA 84
due.enqueue(w);

}
uno.dequeue();
uno.dequeue();
uno.dequeue();
uno.dequeue();
uno.dequeue();
uno.sort();
while (!uno.isEmpty())
System.out.println(uno.dequeue());
System.out.println();
while (!due.isEmpty())
System.out.println(due.dequeue());
}
}





















L'errore lanciato è

Exception in thread "main" java.lang.NullPointerException
at MyCO.enqueue(Main.java:34)
at Main.main (Main.java:84)

Evidenzio nel codice le righe..se qualcuno può aiutarmi..la maggior parte dei programmi che scrivo superano la compilazione ma poi mi viene sempre fuori questo errore..cosa sbaglio??non riesco a capire cosa non sia inizializzato..

2 Risposte

  • Re: Java.lang.NullPointerException ogni volta :(

    Nella riga 34 c'è un if metti le parentesi { } stessa cosa per l'if che fa partire un'eccezione, può essere che il codice cosi come lo hai scritto venga interpretato così:
    
    public void enqueue(Comparable x)
    { 
    if ( x == null)
    {
    throw new IllegalArgumentException();
    Comparable[] newv = new Comparable[vsize*2];
    }
    if (vsize == v.length) RIGA 34
    {
    System.arraycopy(v, 0, newv, 0, vsize);
    newv = v;
    v[ultimo] = x;
    ultimo++;
    vsize++;
    }
    }
    
    Sinceramente non capisco perché ti dia null
  • Re: Java.lang.NullPointerException ogni volta :(

    Ciao, ad occhio credo che il problema sia nel costruttore della classe MyCO:

    class MyCO implements CO {
    private Comparable[] v ;
    private int vsize;
    private int primo;
    private int ultimo;

    public MyCO(){
    Comparable[] v = new Comparable[1];
    vsize = 0;
    primo = 0;
    ultimo = v.length-1;
    }

    .......
    probabilmente il tuo obiettivo era quello di inizializzare la variabile di istanza v ma nel costruttore tu ne dichiari una locale con lo stesso nome.Il risultato è quello di lasciare quella dichiarata a livello di classe al valore di inizializzazione di default per un oggetto( null) , di qui la NullPointerException.Spero di esserti stato di aiuto.
Devi accedere o registrarti per scrivere nel forum
2 risposte