Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - NullPointerException in gui con netbeans
Forum - Java - NullPointerException in gui con netbeans

Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 14:16
Giovedì, 06/03/2008
Salve a tutti ho un problema e non so come sbattere la testa.. probabilmente è una cosa banale ma beh prima mi funzionava dopo 2 o 3 modifiche non va piu.. in ogni caso ho provato a rifare il progetto e non andava ancora.. quindi mi ha questo tipo di errore quando eseguo il programma, in pratica la gui va ma non viene settato il testo dal mio metodo come vorrei:

run:
Exception in thread "main" java.lang.NullPointerException
        at connoracle.OracleMeth.test(OracleMeth.java:25)
        at connoracle.ConnOracleApp.main(ConnOracleApp.java:43)

Questo è il codice OracleMeth che è quello che da problemi:
Codice sorgente - presumibilmente Java

  1. public class OracleMeth {
  2.    
  3.    
  4.  
  5. public static void test()
  6. {
  7. final String url_db = "jdbc:oracle:thin:@localhost:db";
  8. final String user = "user";
  9. final String pswd = "pass";
  10.  
  11. try{
  12. DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  13. ConnOracleView.jEditorPane1.setText("driver Caricati;");
  14. Connection connection = DriverManager.getConnection(url_db, user, pswd);



la riga che è segnata nell'errore è quella che setta il testo del JEditorPane1 nel file ConnOracleView...

che è public static

nela gui non credo ci siano errori.. dato che l'ho fatta con l'ide.

Spero che qualcuno mi possa aiutare !!
ciao ciao
Grazie:k::k:

Ultima modifica effettuata da total il 06/03/2008 alle 14:17
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:03
Giovedì, 06/03/2008
jEditorPane1 non viene allocato prima della chiamata a setText, il motivo è che essendo fatta l'allocazione in initComponents chiamato dal costruttore chiamando direttamente l'oggetto jEditorpane1 accedi all'oggetto senza allocarlo prima visto che l'accesso statico non richiama il costruttore.

Quindi o crei un'istanza di ConnOracleView prima della chiamata statica, o si usa il blocco static (che da quello che mi hai detto in privato non va e bisognerà sistemare qualosa) o crei un metodo statico apposito tramite cui accedere a jEditorPane che prima di fare il return dell'oggetto fa un if per vedere che non sia a null e in quel caso lo alloca:

Codice sorgente - presumibilmente Java

  1. ...
  2. public static getEditor() {
  3. if(jEditorPane1 == null)
  4.  jEditorPane1 = new JEditorPane1;
  5. return jEditorPane1;
  6. }
  7. ...
  8.  
  9. ...
  10. ConnOracleView.getEditor().setText("caricamente riuscito");
  11. ...



usando questo metodo mi sa però che si dovrà controllare anche in initComponents che jEditorPane1 non sia già allocato guardando se è null o meno e solo in quel caso riallocare.
(per modificare il file contenente initcomponents usando netbeans dovrai modificarlo a mano con un editor di testi visto che l'ide blocca quella porzione di file)

La soluzione più pulita sarebbe risistemare il tutto facendo in modo di non usare staticamente quella classe evitando di usare il metodo test di OracleMeth statico, sennò a catena  lo richiede, e in ConnOracleApp creare un oggetto OracleMeth e sull'oggetto chiamare test.

Ultima modifica effettuata da netarrow il 06/03/2008 alle 21:08
PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 9:29
Venerdì, 07/03/2008
Il problema e che se non dichiaro static test() non posso includerla nel main che è per forza statico... del file ConnOracleApp.java
e se non dichiaro static jEditorPane1 non lo posso includere in test()...
Sicuramente la soluzione è piu semplice di quello che pensiamo, c'è l'abbiamo sotto il naso e non la troviamo.
E poi non mi pare possibile se non lo fa toccare quel metodo di netbeans della View mi pare assurdo che tutti usino un altro editor per poter interagire con gli oggetti creati nel frame..

PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 11:36
Venerdì, 07/03/2008
Codice sorgente - presumibilmente Java

  1. public class ConnOracleApp extends SingleFrameApplication {
  2.  @Override protected void configureWindow(java.awt.Window root) {
  3.         OracleMeth oraclemeth = new OracleMeth();
  4.         oraclemeth.test();
  5.     }
  6. ..........



Ecco come ho risolto ho spostato la chiamata alla classe OracleMeth dentro alla funzione contenunta nella classe principale, rendendo cosi la funzione test() di OracleMeth non statica ... Il problema e che non ho ancor preso dimestichezza con netbeans abituato a farmi tutto a mano..
Se qualcuno ha il mio stesso problema può contattarmi..
Grazie net per le risposte..

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 15:59
Venerdì, 07/03/2008
OracleMeth oraclemeth = new OracleMeth();
oraclemeth.test();

era questo che intendevo si, mi dispiace che non ti sia stato subito chiaro e abbia perso tempo.

Cmq puoi tranquillamente inserirlo nel main anche se statico, solo che devi dichiararlo dentro il metodo e non come campo della classe (caso in cui deve essere static)

Testo quotato


E poi non mi pare possibile se non lo fa toccare quel metodo di netbeans della View mi pare assurdo che tutti usino un altro editor per poter interagire con gli oggetti creati nel frame..



per quanto riguarda questo nessuno ha detto che tutti usano un altro ide solo per quel motivo, ma io personalmente odio vedermi bloccati pezzi di codice, e quindi preferisco eclipse dove anche se gli modifico io il codice lo riparsa e si risistema solo.
E' chiaro poi che quando un'ide (uno o l'altro che sia) propone in automatico qualcosa bisogna vedere se non può causare situazioni inutili ed evitabili.

Ultima modifica effettuata da netarrow il 07/03/2008 alle 16:06
PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 20:13
Venerdì, 07/03/2008
Si capisco intendevo solo dire che sicuramente c'era un altra via al modificare il file con un altro ide altrimenti dove stà la comodità??

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:34
Venerdì, 07/03/2008
non indendevo usre un altro ide, semplicemente modificando con notepad.
La motivazione per cui quel codice è bloccato è che per gestire il disegno della gui netbeans non parsa il codice java direttamente ma usa come appoggio un file xml che non deve avere incongruenze pesanti ovviamente rispetto il codice reale.

Cmq ora avendo tolo l'accesso statico dovresti accedere all'oggetto jeditorpane dopo l'allocazione col costruttore e quindi dopo la chiamata del codice bloccato e la modifica non è più necessaria.

Se si avesse usato avanti l'accesso statico si sarebbe richiamato quell'oggetto senza passare per il codice che lo inizializzava in quanto se una classe è usta staticamente non viene allocata e per evitarlo bisognava o inizializzarla in un punto sicuramente eseguito (e qui avevo pensato al blocco static) o controllare se l'oggetto era a null (con il metodo statico get) o instanziare un oggetto prima della chiamata statica (cosa che avrebbe inizializzato il jeditorpane e reso disponibile l'istanza statica a tutti gli oggetti).
Il fatto di inserire nel codice altre inizializzazioni sullo stesso oggetto già esistente in initComponents poteva causare di riallocare un oggetto già creato e portare magari a incongruenze e da qui la probabile necessità di aggiungere nel codice bloccato almeno un if per verificare che l'oggetto sia o meno a null per non perdere il riferimento a un oggetto già esistente.

Questa necessità nessuno ha detto che derivava da un errore dell'ide ma dalla situazione che si è creata, le soluzioni potevano essere adattare tutto a quella situazione (che richiedeva toccare il codice bloccato) o creare una situazione che evitava l'accesso statico (che alla fine hai usato).
L'unica cosa che ho detto su netbeans in privato era proprio il bloccare il codice, su quello era la mia critica niente di più; poi è chiaro che allenandosi  ad usare uno strumento che ha questa caratteristica ti crei una forma mentale che ti aiuta ad evitare di dover toccare determinate parti di codice che può essere anche un bene nel modo di progettare (slegando per bene l'engine dalla gui per dire).
Ma nel mio personale modo di vedere preferisco poter toccare tutto; non volevo evangelizzarti a eclipse e creare mezza flame.

PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 9:01
Sabato, 08/03/2008
Avevo capito i tuoi commenti ma forse mi sono espresso male io...
In ogni caso io utilizzo netbeans per comodità dato che non riesco a scaricare i plugin di eclipse con la banda che hò..
Credo comunque che entrambi siano degli ottimi ide (almeno confrontanto eclpise con la versione 6.0 di netbeans) e che la scelta sia pressochè personale se non si fa parte di un team..

Credo comunque che questa particolarità di netbeans sia come hai detto tu da un lato restrittiva( e poco apprezzata da chi vuole poter controllare tutto, in ffeti anche a me seppur comoda non mi sta simpatica) e da un altro essendo restrittiva riesce a portarti a modificare il codice in funzione della gui e non il contrario, il che può essere un bene ...

In ogni caso ho risolto il problema...
Grazie mille


PM Quote