Messaggi di warning in compilazione

di il
8 risposte

Messaggi di warning in compilazione

Buongiorno a tutti,

sto sviluppando in Java 17.0.10 tramite Apache NetBeans IDE 20

Quando compilo le mie applicazioni mi compaiono parecchi messaggi di warning relativi al caricamento di un DefaultComboBoxModel in varie Combo.
Per esempio dichiaro:

DefaultComboBoxModel<Riga> modCboPeople = new DefaultComboBoxModel<>();

in cui <Riga> è una mia classe con due proprietà; un integer e un String che vengono caricati nelle combo o nelle liste.
In pratica prima creo il modCboPeople caricandovi i record prelevati da una tabella mysql e poi lo carico nella combo con:

CboPeople.setModel(modCboPeople);

Stessa cosa mi capita con le Jlist.

Ora, so benissimo che sono solo dei warning e potrei tranquillamente ignorali, come mi ha già suggerito qualcuno, ma mi piacerebbe tanto capire cosa significano, perché è da mesi che cerco in rete e non riesco a trovare una spiegazione comprensibile.

Qualcuno gentilmente è in grado di spiegarmi cosa significa questo messaggio e come si possa modificare il codice per evitarlo, senza l'uso dell'istruzione

@SuppressWarnings("unchecked")

"warning: [unchecked] unchecked call to setModel(ComboBoxModel<E>) as a member of the raw type JComboBox
CboPeople.setModel(modCboPeople);
 where E is a type-variable:
   E extends Object declared in class JComboBox"

Che avviene in corrispondenza della setModel.

8 Risposte

  • Re: Messaggi di warning in compilazione

    Il problema e' “banale”

    la combo Swing ha' “segnatura”

    public class JComboBox<E> extends JComponent

    Mentre il metodo ‘setModel’ ha segnatura

    public void setModel(ComboBoxModel<E> aModel) { ... }

    Quella ‘E’ non sta' li a fare la maglia, ma serve per dire che quella combo conterra oggetti di tipo ‘E’ e ‘setModel’ deve essere chiamato con oggetti di tipo ‘ComboBoxModel<E>’.

    Nel tuo codice hai usato, INVECE

    ...
    JComboBox CboPeople = new JComboBox()
    ...

    QUINDI il compilatore NON sa chi e' ‘E’ e per default usera ‘Object’ (ma QUALUNQUE COSA in Java deriva da Object !!).

    Poi hai usato

    DefaultComboBoxModel<Riga> modCboPeople = new DefaultComboBoxModel<>();
    ...
    CboPeople.setModel(modCboPeople);
    ...

    Ora: 

    1. modCboPeople e' di tipo “DefaultComboBoxModel<E>” cioe 'E’ e' ‘Riga’
    2. CboPeople  e' di tipo “JComboBox ” (UNCHECKED) e NON di tipo “JComboBox<E>” 

    .

    da cui i warning.

    La soluzione e' “ovvia/banale/semplice/immediata/praticamente ci arriva anche un bambino” SE hai capito il problema ;-)

    DEVI STUDIARE che cosa e come funzionano i template in Java e non andare solo “di istinto” ;-)

    Nota: DEVI ANCHE STUDIARE le convenzioni per la scrittura del codice in Java!
    Tolgo 3 punti al voto d'esame per codice scritto SENZA SEGUIRE le convenzioni ;-)

    https://google.github.io/styleguide/javaguide.html

    https://www.oracle.com/docs/tech/java/codeconventions.pdf

  • Re: Messaggi di warning in compilazione

    Ok, pensavo di aver capito e ho cercato di impostare la proprietà model della CboPeople al valore riga, ma purtroppo mi da errore e non capisco cosa devo fare.

    Se gentilmente riesci a indicarmi la soluzione ti ringrazio tanto.

    Il mio livello attuale di conoscenza non mi consente di trovarla da solo. 

  • Re: Messaggi di warning in compilazione

    Così come hai correttamente tipizzato l'oggetto DefaultComboBoxModel devi tipizzare anche JComboBox.

    DefaultComboBoxModel<Riga> modCboPeople = new DefaultComboBoxModel<>();
    JComboBox<Riga> cbo = new JComboBox<>();
    cbo.setModel(modCboPeople);

    Così non dovrebbe più dare il warning.

  • Re: Messaggi di warning in compilazione

    18/03/2024 - SpiritoLibero ha scritto:


    Così come hai correttamente tipizzato l'oggetto DefaultComboBoxModel devi tipizzare anche JComboBox.

    Grazie per l'indicazione. ;-)
    Allora avevo capito.  Solo che cercavo di impostarlo da NetBeans tramite la proprietà model della JComboBox, perché mi sembrava di ricordare di averlo fatto in un'altra applicazione. Invece mi dava errore.

    Per cui ho dovuto modificare i sorgenti tramite un normale editor di testo, e i warning sono spariti.
    Almeno quelli relativi al caricamento dei model nelle combo.

    Ora rimangono delle segnalazioni come queste:

    warning: [options] bootstrap class path not set in conjunction with -source 8
    Note: Some input files use or override a deprecated API.
    Note: Recompile with -Xlint:deprecation for details.
    Note: Some input files use unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    1 warning

    che però non mi indicano il punto dei sorgenti incriminato, nonostante io abbia impostato sia -Xlint:deprecation che -Xlint:unchecked

    Hai qualche suggerimento?

  • Re: Messaggi di warning in compilazione

    Mi sembra piuttosto strano.

    Ho creato al volo su NetBeans un progetto Ant (quei messaggi li vedevo solamente nei progetti Ant, se tu stai usando un progetto Maven, la procedura è diversa). Ho scritto questo codice:

    package esempio;
    
    import java.util.ArrayList;
    
    public class Esempio {
    
        public static void main(String[] args) {
            ArrayList arr = new ArrayList();
            arr.add("Ciao");
            
            System.out.println( arr.get(0) );
        }
        
    }
    

    Compilandolo mi dà il warning con suggerimento di usare -Xlint:unchecked.

    Quindi ho fatto clic col tasto destro sul nome del progetto ? Properties

    Nella finestra che si apre, ho selezionato la voce “Compiling” che è dentro al nodo “Build”.

    Nella parte bassa del pannello a destra c'è una casella di testo in cui inserire le opzioni per il compilatore e ho scritto esattamente -Xlint:unchecked (vedi immagine qui sotto):

    Ora, ricompilando completamente il progetto (opzione Clean & Build), nella console di Output di NetBeans mi vengono sengnalati esattamente i problemi:

  • Re: Messaggi di warning in compilazione

    Carissimo,
    quello che mi hai descritto in modo molto dettagliato è ciò che ho sempre fatto anch'io.
    Come ho scritto nel mio messaggio precendente infatti ho aggiunto i qualificatori -Xlint:deprecation e -Xlint:unchecked esattamente con la procedura che mi hai visualizzato.

    Mi cogli invece impreparato sul fatto che il mio progetto sia di tipo ant o maven.
    Francamente non ho mai nemmeno capito che cosa fossero.
    Ho sempre creduto che fossero dei tool per scopi particolari e non mi sono mai preoccupato di capire se li stessi usando.

    Io ho sempre usato NetBenas solo per il fatto che mi permetteva di creare le Form prelevando gli oggetti grafici dalla Palette dei componenti e trascinandoli sulla Form e mi permette di scegliere gli eventi associati ai vari oggetti.
    Poi tutto il resto me lo scrivevo io.

    Con i due qualificatori suddetti mi ha sempre segnalato come hai indicato tu, le righe di codice incriminate.
    Invece per i messaggi che ho riportato nel messaggio precedente non me li indica.
    È questo che non capisco da cosa dipenda.

    Come si fa a capire se il mio progetto è di tipo ant o maven?
    Ho provato a cercare in tutte le voci delle proprietà del progetto ma non vi ho trovato nulla.

  • Re: Messaggi di warning in compilazione

    I progetti Maven sono quelli in cui c'è il file pom.xml a descrivere e governare il progetto.

    I progetti nativi di NetBeans (quelli standard, diciamo), invece, sono progetti Ant.

    Li puoi riconoscere anche dall'iconcina accanto al nome del progetto nella lista dei progetti aperti. I progetti Ant hanno il simboletto della tazzina fumante, quelli Maven la tazzina con una M che copre il fumo: 

  • Re: Messaggi di warning in compilazione

    Ok, grazie per il chiarimento.

    Allora i miei sono tutti progetti Ant.

    A questo punto non si capisce come mai nei Warning relativi alle Combo e alle JList mi dava il link alla riga di codice incriminata, mentre negli ultimi warning che ho riportato non me la mette. Boh?

Devi accedere o registrarti per scrivere nel forum
8 risposte