Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema in compilazione, messaggio di attenzione operazione insicura, perchè?

    Ciao,
    stò scrivendo questa classe Java chiamata Involucro che gestisce una collezione di stringhe rappresentate con un Vector.
    Le stringhe accettate dalla collezione hanno la particolarità che la i-esima stringa deve sempre essere contenuta nella (i+1)-esima stringa.

    Quindi saranno collezioni del tipo: {a, ab, abc, z[B]abc]u} tanto per fare un esempio.

    Per ora ho scritto solo il costruttore ed un metodo che aggiunge un elemento alla collezione, tale secondo metodo controlla se la collezione è vuota ci inserisce una stringa ricevuta come parametro, se invece la collezione non è vuota controlla se l'ultimo elemento della collezione è contenuto nel parametro e se è vero lo aggiunge, altrimenti solleva un'eccezione...però mi dà uno strano messaggio in compilazione.

    Il codice è questo:

    Classe Involucro (c'è un sacco di documentazione ma quella è perchè piace alla proff, in realtà sono 3 righe di codice):
    codice:
    import java.util.*;
    
    public class Involucro{
    	/** OVERVIEW: Involucro rappresenta una collezione dinamica di stringhe del tipo <s1, s2, s3,...., sn> tali che 
    				  s_i è completamente contenuta in s_(i+1).
    				  
    				  V = {{s1,s2,s3,...,sn>: Per ogni i s_i è una stringa ed s_i è interamente contenuto in s_(i+1)}}
    				  
    				  O = inserisci: Se l'oggetto che si vuole inserire è coerente con la rappresentazione della collezione
    				                 (è una stringa) e con lo stato attuale della collezione (i valori già presenti nella
    				                 collezione), allora lo inserisce nella collezione modificandola
    				      
    				      fondi: Date collezioni S e T se s_n è interamente contenuto in t_1 allora fonde le due collezioni nel
    				             seguente modo: S = <s1,s2,s3,...,sn> T = {t1,t2,t3,...,tn} --> {s1,s2,s3,...,sn,t1,t2,t3,..,tn}
    				      
    				      get(i): Accede in maniera posizionale all'i-esimo elemento della collezione */
    				     
    	Vector collStr;			// Rappresenta la collezione di stringhe
    	
    	
    	/** FUNZIONE DI ASTRAZIONE: F_a(): STATO CONCRETO ----> STATO ASTRATTO
    								F_a([a, ab, abc, abcd]) ------> {<a, ab, abc, abcd>}
    								ma anche: F_a([a, b(a), (ba)f, z(baf), (zbaf)e]) ---> {a, ba, baf, zbaf, zbafe}
    								
    		INVARIANTE DI RAPPRESENTAZIONE: è un predicato I: C ---> boolean che è vero per gli stati concreti che sono
    										rappresentazioni leggittime di uno stato astratto:
    										
    										I(collStr): collStr != NULL (il Vector deve essere sempre diverso da NULL)
    										Per ogni i: v.get(i) deve essere incluso in v.get(i+1) (la i-esima stringa deve
    										sempre essere interamente contenuta nella (i+1)-esima stringa della collezione */
    										
    	/** COSTRUTTORE:
    		EFFECTS: Crea un nuovo oggetto di tipo Involucro che rappresenta la collezione vuota
    		@param: void:
    		@return: Il riferimento ad un oggetto di tipo Involucro
    		Il costruttore soddisfa l'invariante di rappresentazione in quanto: 1) Viene assegnata alla variabile di istanza
    		collStr il riferimento ad un nuovo Vector quindi no è mai null. 2) Il costruttore crea una collezione vuota che
    		rappresenta la stringa vuota contenuta in ogni stringa, quindi qualsiasi sia il primo elemento va bene */
    		
    	public Involucro(){
    		collStr = new Vector();		// Crea la collezione vuota assegnando a collStr il riferimento ad un nuovo Vector vuoto
    	}
    	
    	/** Metodo inserisci()
    		EFFECTS: Se il parametro può essere inserito nella collezione (se contiene completamente l'ultima stringa della
    				 collezione, allora viene inserito nella collezione rappresentata dall'oggetto ricevente, altrimenti viene
    				 sollevata una StringaNonValidaException
    		MODIFIES: this
    		@param: Un oggetto di tipo String 
    		Il metodo inserisci() soddisfa l'invariante di rappresentazione in quanto se la collezione è vuota permette
    		l'inserimento di una stringa qualsiasi, se invece nella collezione è già presente qualcosa prima di inserire il
    		parametro controlla che il parametro contiene completamente l'ultima stringa presente nella collezione. Se ciò è
    		verificato la inserisce, altrimenti no e la collezione rimane sempre coerente con la sua definizione */
    	
    	public void inserisci(String str){
    		
    		int dimensione = collStr.size() ;	// Contiene la dimensione del Vector collStr
    		if(dimensione == 0)					// Se la collezione è vuota
    			collStr.addElement(str);		// Aggiungi la stringa parametro in prima posizione
    			
    		else{						// Altrimenti, se nella collezione ci sono già degli elementi
    			if(str.contains(collStr.elementAt(dimensione)))	// Se i parametro contiene l'ultima stringa della collezione
    				collStr.addElement(str);					// Aggiungi la stringa parametro in prima posizione
    			else throw new StringaNonValidaException();		// altrimenti solleva un'eccezione
    		}
    	}
    }
    Eccezione:
    codice:
    public class StringaNonValidaException extends RuntimeException{
    	
    	public StringaNonValidaException(){
    		super();
    	}
    	
    	public StringaNonValidaException(String s){
    		super(s);
    	}
    }
    Il messaggio di errore è il seguente:

    C:\Programmi\Crimson Editor\template\esercizi\esami\11-07-07>javac Involucro.java
    Note: Involucro.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    A cosa si riferisce? Che problemi può creare? Soluzioni?

    Grazie
    Andrea

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

    Re: Problema in compilazione, messaggio di attenzione operazione insicura, perchè?

    Originariamente inviato da AndreaNobili
    Il messaggio di errore è il seguente:

    C:\Programmi\Crimson Editor\template\esercizi\esami\11-07-07>javac Involucro.java
    Note: Involucro.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    A cosa si riferisce?
    Al fatto che non hai sfruttato i "generics" per il tuo Vector. In pratica non hai usato Vector<Qualcosa> ma solo il "raw type" cioè Vector.

    Originariamente inviato da AndreaNobili
    Che problemi può creare?
    Se non usi i generics sei comunque tu che devi essere sicuro che es. se inserisci in una collezione un String poi dopo non estrai l'Object e lo casti es. a Integer.
    I warning che ottieni indicano solo: "devi essere sicuro di quello che fai perché altrimenti potresti avere problemi".

    Originariamente inviato da AndreaNobili
    Soluzioni?
    A) Sopprimere i warning di unchecked (lo si fa con una apposita annotazione)
    B) Usare i generics. Il tuo Involucro gestisce stringhe. Quindi:
    Vector<String> collStr;
    e
    collStr = new Vector<String>();

    e se devi estrarre un valore, non è più necessario un cast a String.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Facendo una cosa del genere è lecito?

    codice:
    public void inserisci(String str){
    		
    		int dimensione = collStr.size() ;	// Contiene la dimensione del Vector collStr
    		String ultima = (String)collStr.elementAt(dimensione);
    		if(dimensione == 0)					// Se la collezione è vuota
    			collStr.addElement(str);		// Aggiungi la stringa parametro in prima posizione
    			
    		else{						// Altrimenti, se nella collezione ci sono già degli elementi
    			if(str.contains(ultima))	// Se il parametro contiene l'ultima stringa della collezione
    				collStr.addElement(str);					// Aggiungi la stringa parametro in prima posizione
    			else throw new StringaNonValidaException();		// altrimenti solleva un'eccezione
    		}
    	}
    intendo il casting

    Grazie
    Andrea

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    Facendo una cosa del genere è lecito?

    String ultima = (String)collStr.elementAt(dimensione);
    Se non usi i generics devi fare questo cast. Se usi i generics (collStr è un Vector<String>), il cast è comunque lecito/valido ma del tutto superfluo!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Si è che a lezione non abbiamo studiato i generics...poi me li vedrò per conto mio (da quello che ho capito dovrebbe essere una cavolta...come in C che ad un array gli devo sempre dare un tipo, così in Java con Vector posso creare Vector che hanno tutti lo stesso tipo o Vector che possono contenere al proprio interno riferimenti ad oggetti di tipo diverso,è questo il concetto?)

    Ora però volevo finire questo esercizio il più velocemente possibile con i mezzi che abbiamo fatto a lezione...

    Certo che però più studio più capisco che abbiamo fatto proprio l'ABC di Java...spero di imparare qualcosa di più approfondito nei prossimi corsi...

    Grazie
    Andrea

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    da quello che ho capito dovrebbe essere una cavolta...
    No, proprio per niente! .... c'è molto dietro i generics. Aspetta di vedere il subtyping sui tipi parametrici, i wildcard, i bounds, la erasure e poi mi dici se è ancora una cavolata ...

    Originariamente inviato da AndreaNobili
    Ora però volevo finire questo esercizio il più velocemente possibile con i mezzi che abbiamo fatto a lezione...
    Se non usi i generics hai quei warning. Puoi ignorarli (non sono errori che precludono la compilazione) oppure sopprimerli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    No, proprio per niente! .... c'è molto dietro i generics. Aspetta di vedere il subtyping sui tipi parametrici, i wildcard, i bounds, la erasure e poi mi dici se è ancora una cavolata ...

    Se non usi i generics hai quei warning. Puoi ignorarli (non sono errori che precludono la compilazione) oppure sopprimerli.
    Ok...prometto che appena ho un po' di tempo me li vedrò...ora purtroppo non posso...l'esame è vicinissimo...questa estate comunque intendo approfondire un po' gli argomenti che sono stati saltati nel programma del corso ma che potrebbero essere comunque legati a quanto abbiamo svolto (tipo in questo caso che è un argomento legato ai Vector ma che non è stato fatto)

    Preferisco approfondire gli argomenti correlati a cose svolte piuttosto che andare avanti per conto mio avendo però grossi buchi...

    Ti ringrazio

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.