PDA

View Full Version : [Java]NullPointerException


Dyd87
27-08-2009, 14:52
Salve a tutti
Ho un problema in questa parte di codice.
Sostanzialmente deve trasferire alcuni file (txt) , in modo random , da un Client ad un Server (sia esso runnato come LocalHost o da due pc).
Una volta avviato il programma mi restituisce l'errore come da titolo: il prompt che fa da Server si blocca e il Client termina l'esecuzione in modo "corretto".
I file che dovrebbero passare dal Client al Server sono perņ effettivamente passati , nonostante l'errore in questione si presenti nella write sul buffer.

Ecco il codice:


private void upload()
{
//Dichiarazione delle variabili locali
ObjectInputStream ois = null;
FileOutputStream fos = null;
byte[] pacchetto = null;

//
for(i = 0; i < 10; i++)
{
try
{
ois = new ObjectInputStream(sock.getInputStream()); //Crea un oggetto dal flusso
fos = new FileOutputStream("Client.txt"); //Apertura di un flusso per il salvataggio del file
pacchetto = (byte[])(ois.readObject()); //Legge il flusso e scrive nel buffer
}
catch(ClassNotFoundException e7)
{
}
catch(IOException e)
{
System.out.println("IOex");
}

try
{
fos.write(pacchetto);
}
catch(IOException e)
{
}
}

try
{
ois.close(); //Chiusura dell'ObjectInputStream
fos.close(); //Chiusura del FileOutputStream
}
catch(IOException e10)
{
}
}



Come fare?
E' possibile bypassare l'errore e far continuare comunque l'esecuzione , visto che i file comunque arrivano , tutti interi?

Grazie mille
Saluti :)

PGI-Bis
27-08-2009, 15:24
Riordinando un po' le cose il caso "NPE" dovrebbe sparire:

private void upload() {
//Dichiarazione delle variabili locali
ObjectInputStream ois = null;
FileOutputStream fos = null;
byte[] pacchetto = null;

//
for (i = 0; i < 10; i++) {
try {
ois = new ObjectInputStream(sock.getInputStream()); //Crea un oggetto dal flusso
fos = new FileOutputStream("Client.txt"); //Apertura di un flusso per il salvataggio del file
pacchetto = (byte[]) (ois.readObject()); //Legge il flusso e scrive nel buffer
fos.write(pacchetto);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try { close(ois); } finally { close(fos); }
}
}
}

private void close(Closeable c) {
try {
if(c != null) {
c.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}

A meno che non capiti proprio qui:

pacchetto = (byte[]) (ois.readObject());

Dyd87
27-08-2009, 15:39
Grazie , proveremo ;)

Dyd87
27-08-2009, 16:20
Allora , continua a dare quell'errore.
Mi sono dimenticato di postare anche la Run del Thread Server.
Il problema si presenta all'interno della Switch (dove si nota la presenza della funzione UPLOAD descritta nel mio primo post).
Dopo aver eseguito il metodo Upload il Server continua a ciclare senza eseguire le istruzioni nella try (indicata in grassetto).
Quando invece esegue uno degli altri due metodi indicati nello Switch , tutto funziona correttamente (entra nella try indicata sotto ed esegue).




public void run()
{
//si attende l'inizio della simulazione
try
{
this.signal.await();
}
catch(InterruptedException e)
{
}

//creazione della ServerSocket e del rapporto relativo alla porta del server
try
{
SSocket = new ServerSocket(porta);
createInfoDoor();
System.out.println(this.getName() + ": in ascolto...");
}
catch(IOException e)
{
System.out.println(this.getName() + ": Impossibile creare la ServerSocket!");
}

//...
while(!endProgram)
{
try
{
pw.println("-In attesa di connessione con un Client...");
sock = SSocket.accept();
getIPClient();
pw.println("Connessione da parte del Client "+ sock + " riuscita");
System.out.println("Client "+ sock.getInetAddress() + " connesso a " + this.getName());
}
catch(IOException e)
{
pw.println("ERRORE: Impossibile stabilire la connessione con il Client!");
}

//instaurare il flusso in entrata e in uscita
try
{
//creazione canali di lettura e scrittura messaggi
streamIn = new InputStreamReader(sock.getInputStream());
streamOut = new OutputStreamWriter(sock.getOutputStream());
//creazione buffer di supporto per lettura e scrittura
bufIn = new BufferedReader(streamIn);
bufOut = new BufferedWriter(streamOut);
printBuf = new PrintWriter(bufOut, true);
pw.println("Flussi per gli scambi di informazioni stabiliti");
}
catch(IOException e)
{
pw.println("ERRORE! Flussi per gli scambi di informazioni non stabiliti!");
}

do
{
scelta = 0;
//acquisizione della scelta del Client
try
{
choise = bufIn.readLine();
scelta = Integer.parseInt(choise);
endConnection = false;
}
catch(IOException e)
{
//endConnection = true;
}

//esecuzione dell'operazione scelta
switch(scelta)
{
case 1:
chat();
break;
case 2:
upload();
break;
case 3:
endConnection = true;
break;
default:
System.out.println("c***o!");
break;
}
}
while(!endConnection);
System.out.println("Client "+ sock.getInetAddress() + " disconnesso da " + this.getName());

//chiudere le connessioni con il Client
try
{
streamIn.close();
streamOut.close();
printBuf.close();
sock.close();
}
catch(IOException e)
{
}
}

//chiudere la ServerSocket ed il rapporto
try
{
fw.close();
pw.close();
SSocket.close();
}
catch(IOException e)
{
}
System.out.println(this.getName() + ": Ho terminato!");
}

PGI-Bis
27-08-2009, 16:42
L'eccezione a che linea di codice fa riferimento?

Dyd87
27-08-2009, 17:09
L'eccezione a che linea di codice fa riferimento?

L'eccezione fa riferimento al metodo UPLOAD(primo post) , nella riga



fos.write(pacchetto);



Uscendo dal metodo UPLOAD il Server dovrebbe acquisire un dato/valore dal Client , tuttavia ciņ non avviene , mentre negli altri casi si (vedasi altri metodi , contenuti nello SWITCH).

(Inspiegabile? :mc: )

PGI-Bis
27-08-2009, 17:19
Prova con un debugger a vedere se "pacchetto" č null. Dovrebbe perchč in quella linea fis č null solo se si verifica un'eccezione di IO che perņ viene catturata saltanto pacchetto.