Newsgroup: it.comp.java
Titolo: Battaglia Navale

Salve
Sto cercando un semplice esempio di battaglia navale realizzata con Swing in
Java. Chi puo' consigliarmi un sito dove scaricare il sorgente?
C'e' qualcuno che ha realizzato semplici giochi con le Swing? Potreste
postarmi i sorgenti all'indirizzo 
max...@tiscalinet.it
?
Grazie mille!
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.303 / Virus Database: 164 - Release Date: 24/11/2001

Complimenti,
in due soli post sei già riuscito a farmi ridere e piangere allo stesso
tempo.
Qualche consiglio:
* Non chiedere mai di cercarti qualcosa e poi pure di mandartelo: qui c'é
molta gente disposta a aiutare i neofiti, ma non certo a fare il lavoro al
posto loro.
* Procurati un buon libro su Java, perché domande come "Perché ho
NullPointerException quando non creo un'istanza e poi cerco di chiamare un
metodo?" trovano risposte in 3 secondi in un libro, mentre in un newsgroup
hai l'inconveniente di aspettare ore, oltre ad abbassare il livello generale
dei contributi. Non credere di poter imparare a programmare in Java ponendo
domande sul newsgroup ad ogni eccezione o errore di compilazione che non
capisci, perché non hai fatto lo sforzo di leggerti un libro o la
documentazione.
* Procurati la documentazione online di Java, detta Javadoc API. Trovi tutto
quello che hai bisogno:
http://java.sun.com/j2se/1.4/docs/api/index.html
 (puoi anche scaricarla
interamente).
* Leggiti gli articoli del Tutorial di Sun:
http://java.sun.com/docs/books/tutorial/index.html
Buona fortuna
Carlo Jelmini
"Maxy" <SP...@Tiscalinet.it> a écrit dans le message news:
YsGm8.57651$1S3.1...@twister1.libero.it...


 * Procurati la documentazione online di Java, detta Javadoc API.
Anche quella scaricata, installata e consultata ma, scusami la bassezza, non
riesco a venire a capo del problema!!!!!


 potresti elevarmi?
Ti do' ora un'informazione conosciuta da pochi iniziati: puoi scoprire la
causa esatta dell'errore grazie alle informazioni graziosamente fornite
dall'eccezione!!
Exception in thread "main" java.lang.NullPointerException
        at SelezionaElemento.itemStateChanged(SelezionaElemento.java:43)
        at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:846)
        at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:891)
        [snip]
        at javax.swing.JComboBox.addItem(JComboBox.java:510)
        at SelezionaElemento.<init>(SelezionaElemento.java:19)
        at SelezionaElemento.main(SelezionaElemento.java:50)
Dunque, dopo qualche incantazione magica e la  lettura di questo scorcio di
stack trace partendo dalla fine, posso dire con certezza che alla linea 19
del costruttore (<init>) chiami JComboBox.addItem(). Questa operazione
provoca tutta una serie di chiamate interne alla JComboBox per giungere
infine a fireItemStateChanged() che, oh sorpresa, chiama il metodo
itemStateChanged() della tua classe SelezionaElemento. L'eccezione é poi
sollevata alla linea 43.
Sarai d'accordo con me che alla linea 19 del costruttore la tua variabile
result non é ancora inizializzata, quindi se un'addItem() finisce per
chiamare itemStateChanged() é logico che result.setText() sollevi una
NullPointerException.
Una domanda sorge spontanea: come mai dopo aver chiamato addItem() sulla
combobox, quest'ultima si ritrova a chiamare il tuo metodo
itemStateChanged()?
Semplice: tu hai detto alla JComboBox di aggiungere la tua classe alla lista
degli "ascoltatori" interessati a conoscere un cambiamento negli intem della
stessa, usando il metodo JComboBox.addItemListener(this). Dunque quando
subito dopo aggiungi degli item alla combobox, questa notifica subito alla
tua classe il cambiamento chiamando itemStateChanged(), tutto questo prima
che result sia inizializzato.
Per contro quando tu dichiari:
private JTextField result = new JTextField();
questo funziona perché l'inizializzazione ha luogo prima che il codice del
costruttore sia eseguito, dunque il problema esposto sopra non si pone.
Soluzione: inizializza prima la JTextField e poi la JComboBox.
Morale: lo stack trace di un'eccezione é fornita per dare preziose
informazioni sull'origine dell'errore.
Per questa volta te ne ho fatto l'interpretazione, ma se impari a tua volta
i misteri dello stack trace vedrai che i tuoi prossimi interventi
contribueranno ad alzare il livello del newsgroup.
Ti segnalo anche che, oltre allo stack trace, un debugger ti puo' essere di
estremo aiuto in casi come questi, nei quali non riesci a determinare
l'ordine di esecuzione.
bye
Carlo Jelmini

 che result sia inizializzato.


 consultazione su un libro!!!!!
Nessun problema é banale quando si é novizi.
Quello che ti si chiede é di *esporre* il problema in modo meno banale.
Domande come "Mi solleva un'eccezione. Perché?" inducono a pensare che non
hai fatto lo sforzo necessario per circonscrivere il problema. Un lettore
frettoloso del newsgroup tende a soffermarsi solo sulle domande interessanti
e ben formulate.
Nel tuo caso, la domanda avrebbe dovuto essere formulata in questo modo: "Lo
stack trace mi dice che quando aggiungo un elemento ad una JComboBox con
addItem(), quest'ultima finisce con il chiamare prematuramente il mio metodo
itemStateChanged(). Come mai?".
Nota che il problema non domandava nemmeno la consultazione di un libro, ma
solo 1 secondo per interpretare correttamente lo stack trace. Spero che tu
non abbia solo ritenuto la soluzione immediata al tuo problema, ma che tu
abbia aggiunto l'interpretazione corretta dello stack trace alle tue
competenze.
bye
Carlo Jelmini