Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Exception in thread "Thread-6" java.lang.NullPointerException

    Salve ragazzi ho un problema a runtime che genera l'errore presente nel titolo.
    Il codice che genere l'errore è:
    codice:
    public class CountDown extends Thread{
        
        private javax.swing.JLabel jLabel1;
        
        public CountDown(javax.swing.JLabel a)
        {
            jLabel1=a;
        }
        
        public CountDown(){}
        
        int b=0;
        @Override
        public void run()
        {
            for(int i=0;i<=30;i++)
            {
                b=30-i;
                jLabel1.setText(Integer.toString(b)); //L'ERRORE STA QUI!!!!
                try
                {           	
                    Thread.sleep(1000);
                }
                catch (Exception e)
                {
                    System.out.println(e.getMessage());
                }
            }
            
            jLabel1.setText("Tempo Scaduto");
        }
        
    }
    Le chiamate avvengono in questo metodo:

    Classe 1
    codice:
    Classe2 obj1= new Classe2();
    CountDown obj2=new CountDown(jLabel1);
    Classe 2
    codice:
    CountDown obj=new Countdown();
    obj.start();

    Classe1, Classe2, CountDown risiedono in file diversi all'interno dello stesso progetto.
    Grazie in anticipo a chiunque voglia aiutarmi!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    l'errore parla chiaro: c'è qualcosa null.

    separa le istruzioni

    codice:
    jLabel1.setText(Integer.toString(b)); //L'ERRORE STA QUI!!!!
    fai

    codice:
    String tmp = Integer.toString(b); 
    jLabel1.setText(tmp);
    mi aspetto che ad essere null sia jLabel1 e mi aspetto problemi di accesso concorrente
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Grazie per la risposta.
    Fatto, rimane lo stesso errore, relativo alla seconda riga
    codice:
    JLabel1.setText(tmp)
    nessun'altro adopera quella jLabel1..

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sapevo sarebbe rimasto lo stesso, quando uso metodi composti come hai fatto tu per capire chi effettivamente è null separo le istruzioni, ti ripeto mi aspettavo quel valore null.

    Devi vedere come istanzi e usi quel thread (cioè come fai ad avere lì null)
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Grazie per il consiglio
    Non riesco a trovare conflitti..
    Ecco il codice:

    MainClass
    codice:
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        SendFile obj=new SendFile("127.0.0.1");
        CountDown ob=new CountDown(jLabel1);
        obj.takeFile();
        obj.start();
    }
    SendFile
    codice:
    package tesi;
    
    
    public class SendFile extends Thread
    {
        
    String ip;
    public SendFile(String ip)
        {
         this.ip=ip;
        }
         
        String text;
        DataInputStream in1;
        BufferedReader in;
        FileInputStream fis;
        File f;
        Socket s1;
        Socket s2;
        
        
        //Mette in fis il file pronto per essere inviato
        public void takeFile()
        {
            
            
            JFileChooser chooser = new JFileChooser();
            int n = chooser.showOpenDialog(chooser);
            if(n==JFileChooser.APPROVE_OPTION)
            {
                f = chooser.getSelectedFile();
                try 
                {
                    fis = new FileInputStream(f);
                } 
                catch (FileNotFoundException ex) 
                {
                    Logger.getLogger(SendFile.class.getName()).log(Level.SEVERE, null, ex);
                }
           }
        }
        
        // Si connette al Server e invia il File
        @Override
        public void run()
        {
            try 
            {
               s2 = new Socket (ip,5556);
                
               //Invio al server il nome del File 
               OutputStream out2 = s2.getOutputStream();
               PrintWriter alServer= new PrintWriter(out2,true);
               
               String nome=f.getName();
               alServer.println(nome);
              // out2.close();
              // s2.close();
               System.out.println(nome);
                
                
                
                byte[] buf = new byte[fis.available()]; 
    
                
                            s1 = new Socket (ip,5555);
    
                // Invio l'intero flusso di bytes al server e chiudo file in ingresso flusso di comunicazione e socket
                int read;
                OutputStream out1 = s1.getOutputStream();
                CountDown obj=new CountDown();
                obj.start();      -------- ECCO QUI ----------- 
                while ((read = fis.read(buf)) != -1) 
                {
                    out1.write(buf, 0, read);
                }
                fis.close();
                out1.close();
                s1.close();
                
                
            } 
            catch (UnknownHostException ex) 
            {
                Logger.getLogger(SendFile.class.getName()).log(Level.SEVERE, null, ex);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(SendFile.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        
        
    }
    La classe CountDown è quella già postata.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ooookkkkkk ma visto che abbiamo capito che jLabel1 è in quel punto null, perché non metti qualche breakpoint e fai un po' di debug?
    punti chiave quelli in cui fai qualsiasi modifica a jLabel1
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Non ho mai usato i breakpoint, sto provando ma non ci capisco un granchè.
    Ho provato a mettere qualche print e ho visto che la JLabel1 viene correttamente passata, è come però se, quando la classe SendFile invoca il costruttore vuoto della classe CountDown, la jLabel1 si venisse e perdere.
    Prima di adoperare la classe CountDown in questo progetto mi sono accertato che funzionasse "a solo" ed effettivamente era così, l'unione ha generato questo problema.
    Non ci sono proprio altri punti in cui qualcuno adopera la jLabel1, questa viene creata e direttamente passata al CountDown, nessuno la adopera.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ho capito, ma se tu chiami un costruttore vuoto e non ti preoccupi di inizializzare ad un valore di default una variabile interna che usi, come speri che tutto vada bene?
    Elimina il costruttore senza parametri, per come hai fatto il tutto non deve esistere
    RTFM Read That F*** Manual!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Originariamente inviato da valia
    ho capito, ma se tu chiami un costruttore vuoto e non ti preoccupi di inizializzare ad un valore di default una variabile interna che usi, come speri che tutto vada bene?
    Mi sono preoccupato di rimepire la jLabel1 prima di tutto ovvero quando dico:
    codice:
    CountDown ob=new CountDown(jLabel1);
    Elimina il costruttore senza parametri, per come hai fatto il tutto non deve esistere
    Il costruttore vuoto mi serve per la chiamata a run che faccio all'interno della classe send, puoi trovarlo nelle ultime righe di codice della classe send, l'ho evidenziato in grassetto due risposte fa.


    La sequenzialità delle azioni fa si che quando run viene invocato, jLabel1 è già riempito.. o almeno nella mia testa

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da playbasfa
    Il costruttore vuoto mi serve per la chiamata a run che faccio all'interno della classe send, puoi trovarlo nelle ultime righe di codice della classe send, l'ho evidenziato in grassetto due risposte fa.
    La tua classe ha due costruttori: il primo prende una JLabel e inizializza la variabile locale al thread "jLabel1"; il secondo non prende nulla e non inizializza nulla.

    Di conseguenza, se richiami il secondo, non puoi aspettarti di poter usare jLabel1 perchè non è inizializzata.

    Hai due scelte da fare:

    1) Elimini il costruttore vuoto: per inizializzare un oggetto CountDown devi passargli una label
    2) Verifichi nel metodo run se la variabile jLabel1 è nulla: in quel caso, non dovrai usarla.

    Altre possibilità non ce ne sono.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.