Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Problema di cast?

  1. #1

    Problema di cast?

    Ciao, dopo alcuni giorni in cui, probabilmente per qualche strana congiunzione astrale, riuscivo a fare tutto al primo colpo, sono tornato ad arenarmi.
    La situazione è questa: finestra principale con una JTexField dove inserire il cognome del cliente da cercare e un JButton che premuto effettua la ricerca. Il risultato della query viene memorizzato su un oggetto Vector < String > . Se il vettore non ha nessun elemento (e quindi in buona sostanza quel cliente non esiste), si apre una maschera vuota che permette l'inserimento dei dati e fin qui tutto regolare. Se il vettore contiene un solo elemento si dovrebbe aprire la stessa maschera con i dati di quel cliente. Per fare ciò dovrebbe passare alla classe della maschera la stringa dell'ID del cliente, ma nel tentativo di recuperare questa stringa la VM mi solleva la seguente eccezione:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
    at luna.GUI.PannelloRicerca.effettuaRicerca(PannelloR icerca.java:51)
    at luna.GUI.PannelloRicerca.actionPerformed(PannelloR icerca.java:35)
    at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2013)
    at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2336)
    at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:405)
    at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:260)
    at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:254)
    at java.awt.Component.processMouseEvent(Component.jav a:6100)
    at javax.swing.JComponent.processMouseEvent(JComponen t.java:3288)
    at java.awt.Component.processEvent(Component.java:586 5)
    at java.awt.Container.processEvent(Container.java:211 0)
    at java.awt.Component.dispatchEventImpl(Component.jav a:4461)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2168)
    at java.awt.Component.dispatchEvent(Component.java:42 87)
    at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4466)
    at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4130)
    at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4060)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2154)
    at java.awt.Window.dispatchEventImpl(Window.java:2555 )
    at java.awt.Component.dispatchEvent(Component.java:42 87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java: 605)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:276)
    at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:191)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:186)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:178)
    at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:139)

    Da quello che ho capito vuol dire che non può fare il cast da String a String[] e mi va bene, ma l'oggetto dovrebbe essere una stringa. Posto solo la parte di codice interessata, premettendo che: effettuaRicerca è il metodo chiamato dalla pressione del JButton e luna.Start.db è l'istanza di una classe che esegue le istruzioni sul database, gentilmente concesso da un frequentatore di questo forum http://forum.html.it/forum/showthrea...hreadid=801696

    codice:
    public void effettuaRicerca() {
    		cognome = inseriscicognomeTF.getText();
    		System.out.println("Sto cercando il Sign. "+cognome);
    		Vector<String> v = luna.Start.db.eseguiQuery("SELECT ID FROM clienti WHERE cognome='"+cognome+"' ;");
    		int vSize = v.size();
    		if (vSize == 0) {
    			System.out.println("Non esiste");
    			PannelloPrincipale.pannelloCorrente = "PannelloCliente";
    			PannelloPrincipale.layout.show(FinestraPrincipale.one, "" + PannelloPrincipale.pannelloCorrente);
    		}
    		if (vSize == 1) {
    			System.out.println("Esiste un solo record");
    			String value = (String)v.elementAt(0);
    			System.out.println(value);
    			//String idCliente = v.get(0);
    					}
    	}
    Vi ringrazio anticipatamente per l'aiuto.
    Ciao
    Matteo

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Java ha un forum dedicato.

    Sposto.


    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

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema di cast?

    Originariamente inviato da lucifer81
    codice:
    		Vector<String> v = luna.Start.db.eseguiQuery("SELECT ID FROM clienti WHERE cognome='"+cognome+"' ;");
    Se hai usato il codice postato nella "pillola", allora hai certamente visto che il metodo ritorna Vector e non Vector<String>. Dal codice del metodo eseguiQuery si capisce facilmente che il Vector ritornato contiene oggetti String[] in cui per ognuno ci sono i dati delle colonne.

    A parte il fatto che quella eseguiQuery() estrae tutte le colonne come String, il che è molto specifico, non certo generico (e fa un clone() che non serve). Ma non è questo il punto.

    È l'uso che ne fai del Vector ritornato che è sbagliato. Innanzitutto è sbagliato Vector<String>, perché in realtà dovrebbe essere al massimo Vector<String[]>. In ogni caso avresti un warning di unchecked cast per via del passaggio da raw type a parameterized type.

    Quindi dal Vector devi estrarre un elemento che è di tipo String[] e poi su questo array puoi accedere ad un dato della colonna.
    Visto che già il metodo eseguiQuery() non usa i generics, potresti non usarli nemmeno tu:

    codice:
    Vector v = luna.Start.db.eseguiQuery("SELECT .....");
    ...
    if (vSize == 1) {
        System.out.println("Esiste un solo record");
        String[] riga = (String[]) v.elementAt(0);
    
        //.... usa riga[n] per accedere alla colonna
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Intanto vi ringrazio per i consigli e la spiegazione. Ho risolto il problema come mi avete suggerito e ho imparato una cosa nuova, anche se devo ancora capire fino in fondo perché la query ritorna un vettore di array di stringhe anche quando gli oggetti sono una stringa sola.
    Mi scuso per l'errore del luogo di post, ero concentrato sul problema.
    Ciao

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.