Newsgroup: it.comp.java
Titolo: Aiuto applet

Ho pensato di scrivere un applet che facesse dei roll over, e con un clic
potesse cambiare frame multipli.
Siccome sono un po inesperto di java ho avuto una serie di problemi.
Il programma viene compilato bene ma quando si tratta di eseguirlo ho delle
exception per quanto riguarda dei null pointer! E sinceramente non riesco a
capire come potrei risolvere il problema.
potete darmi una mano?
vi ringrazio da ora e allego il codice:
import java.applet.*;
import java.awt.*;
import java.net.*;
public class Over extends Applet {
public MediaTracker traccia;
public int numero;
public TastoRoll array[];
public Image listatt[];
public int illuminata;
public int altezza[];
public int quanti[];
    /**
     * Initializes the applet.  You never need to call this directly; it is
     * called automatically by the system once the applet is created.
     */
    public void init() {
 illuminata = 10;
 String s = getParameter("numero");
 if (s == null)
  numero = 1;
 else numero = Integer.parseInt(s);
 int i;
 int app;
 int app2;
 int h;
 TastoRoll array[] = new TastoRoll[numero];
 Image listatt[] = new Image[numero];
 int quanti[] = new int[numero];
 int altezza[] = new int[numero+1];
 traccia = new MediaTracker(this);
 altezza[0]= 0;
 for (i=0;i<numero;i++){
 app = i +1;
  array[i].originale = getImage(getDocumentBase(),getParameter("im"+app));
  array[i].scambiata =
getImage(getDocumentBase(),getParameter("imRoll"+app));
  //array[i].ripristina = new boolean(getParameter("R"+i));
  traccia.addImage(array[i].originale,0);
  traccia.addImage(array[i].scambiata,1);
  listatt[i] = array[i].originale;
  altezza[i+1] = (listatt[i].getHeight(this)+ 1);
  quanti[i] =Integer.parseInt(getParameter("im"+app+"quanti"));
  array[i].alloca(quanti[i]);
  for (h=0;h<quanti[i];h++){
  app2 = h+ 1 ;
   String urla = getParameter("I"+app+"Url"+app2);
   if (urla != null ) {
   try  {
    array[i].onclick[h].pagina = new URL(urla);
       }  catch (Exception e)  {
     System.err.println("Can't open location.");
        repaint();
       }
   }
   array[i].onclick[h].indirizzo=new
String(getParameter("I"+app+"Frame"+app2));
  }
 }
    }
public void paint(Graphics g)  {
 int ciclo;
 try  {
       traccia.waitForID(0);
       traccia.waitForID(1);
 }
 catch (Exception e)  {
       g.drawString("Can't load images.", 5, 30);
       System.err.println("Can't load images");
 }
 for (ciclo=0;ciclo<numero;ciclo++) {
  g.drawImage(listatt[ciclo],0,altezza[ciclo],this);
 }
}
public boolean mouseEnter(Event evt, int x, int y)  {
 int ciclo;
 for (ciclo=0;ciclo<numero;ciclo++){
  if (y>altezza[ciclo] && y<altezza[ciclo+1]){
   listatt[ciclo] = array[ciclo].scambiata;
   if (illuminata != ciclo){
    listatt[illuminata] = array[illuminata].originale;
    illuminata = ciclo;
   }
  repaint();
  return true;
  }
 }
return false;
}
public boolean mouseDown(Event evt, int x, int y)  {
int ciclo;
 for (ciclo=0;ciclo<numero;ciclo++){
  if (y>altezza[ciclo] && y<altezza[ciclo+1]){
   array[ciclo].scambia(quanti[ciclo]);
   repaint();
   return true;
  }
 }
return false;
}
   /* public void start() {
    }
    public void stop() {
    }
    public void destroy() {
    }*/
}
----------------------------------------------------------------------------
---------------
import java.applet.*;
import java.awt.*;
import java.net.*;
public class TastoRoll extends Applet {
public Image originale;
public Image scambiata;
public boolean ripristina;
public destinazione onclick[];
 public void alloca (int num){
 destinazione onclick[] = new destinazione[num];
 }
    public void scambia(int numero) {
    int ciclo;
    for (ciclo=0;ciclo<numero;ciclo++)
getAppletContext().showDocument(onclick[ciclo].pagina,onclick[ciclo].indiriz
zo);
    }
}
----------------------------------------------------------------------------
--
import java.applet.*;
import java.awt.*;
import java.net.*;
public class destinazione {
public URL pagina;
public String indirizzo;
}



capire come potrei risolvere il problema.
Dando una diagnostica migliore.  Le exception ti dicono _dove_ si
sono verificate; se non te lo dicono con sufficiente precisione, poni
blocchi try/catch per identificarlo.  Dovresti riuscire a capire in che
linea di codice hai un null pointer e di conseguenza quale possa
essere.  Solo sapere che un blobbo di codice di queste dimensioni
"ha delle exception per quanto riguarda dei null pointer" e` diagnosi
di gran lunga troppo vaga perche` valga la pena di spenderci tempo
a passarlo al setaccio.
Alex

Alex Martelli wrote:

mandando il programma in run con java workshop 2.0 la console mi da questi
errori
java.lang.NullPointerException
     at Over.init(Compiled Code)
     at sun.applet.AppletPanel.run(Compiled Code)
     at java.lang.Thread.run(Compiled Code)
provando a stoppare il programma e a farlo ripartire con  uno step over
mi compaioni i messaggi di null pointer exception come prima e il codice si
ferma
in 
java.net
nella funzione  public URL(URL context, String spec) throws
MalformedURLException
alla riga: try {
     limit = spec.length();
io allinterno dell applet ho chiamato la funzione URL ( String spec)
che richiama la funzione sopra menzionata in questo modo Url (null,spec)
quindi l errore dovrebbe essere nella mia acquisizione dell indirizzo
il mio codice è fatto così in quel punto :
String urla = getParameter("I"+app+"Url"+app2);
   if (urla != null ) {
   try  {
    array[i].onclick[h].pagina = new URL(urla);
       }  catch (Exception e)  {
     System.err.println("Can't open location.");
        repaint();
       }
la quale è racciusa ne seguente ciclo :
for (h=0;h<quanti[i];h++){
  app2 = h+ 1 ;
mentre lo copiavo mi sono accorto che il ciclo in se è sbagliato e che devo fare
il ciclo fino a quanti[i]-1 ma non penso che l errore sia causato da questo.
E sinceramente il codice sopra mi smbra giusto...
... mi metto a passare al setaccio tutto l applet e vediamo cosa salta fuori.

Appena ho avuto un po di tempo mi sono messo a setacciare l applet e ho trovato il
punto dove trova il(i) null pointer,
questi sono dovuti al fatto che nono riesce a caricare le immagini :( e quindi
quando faccio operazioni su queste
mi ritorna un erroe
Spero che qualcuno mi sappia dire perchè le tre righe di codice sotto nono vanno
bene...
all inizio ho pensato che il problema potesse essere causato dagli int che gli
inserivo dirtettamente nella stringa, quindi ho inserito
la variabile appoggio che dovrebbe ricevere il valore numerico di app convertito in
stringa
quindi faccio un cat nel getParameter
sinceramente nella disperazione ho provato a mettere direttamente il nome della
prima variabile
di immagine in get paramter e cioè direttamente im1 per verificare se l errore si
potesse trovare
in qualche modo nella concatenazione di im con appoggio
ma non funziona ugualmente
Purtroppo sono un novellino di java e non riesco proprio a capire dove sbaglio...
appoggio = String.valueOf(app);
try  {
 array[i].originale = getImage(getDocumentBase(),getParameter("im" + appoggio));
 } catch (Exception e)  {
  System.err.println("non riesco a caricare la prima immagine");
}
try  {
 array[i].scambiata = getImage(getDocumentBase(),getParameter("imRoll" + appoggio));
 } catch (Exception e)  {
  System.err.println("non riesco a caricare la seconda immagine");
}
traccia.addImage(array[i].originale,0);
traccia.addImage(array[i].scambiata,1);
listatt[i] = array[i].originale;
altezza[i+1] = (listatt[i].getHeight(this)+ 1);
Ciao Sean

...
    (problemi con getImage)
getImage ritorna subito, indipendentemente dal fatto che l'immagine esista
o meno.  Giusto fare l'addImage ad un MediaTracker, ma devi anche poi
aspettare il caricamento.  Non so se sia questo che ti causa il null
pointer,
ma hai provato ad aggiungere opportune chiamate di wait e verifiche dello
stato di loading delle varia immagini...?
Alex