2010-04-12 12 views
18

Prima di tutto, sono abbastanza nuovo in Java, quindi mi dispiace se questa domanda è assolutamente semplice.Come faccio a verificare se una variabile è stata inizializzata

Il fatto è: ho uno String[] s creato dividendo una stringa in cui ogni elemento è un numero. Voglio trasmettere gli elementi di s a int[] n.

s[0] contiene il numero di elementi che n manterrà, effettivamente s.length-1. Sto cercando di farlo utilizzando un ciclo foreach:

int[] n; 
for(String num: s){ 
    //if(n is not initialized){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 

Ora, mi rendo conto che avrei potuto usare qualcosa di simile:

int[] n = new int[(int) s[0]]; 
for(int i=1; i < s.length; i++){ 
    n[i-1] = (int) s[i]; 
} 

Ma sono sicuro che mi sarà di fronte a quella "se n non è inizializzato inizializzalo" problema in futuro.

+0

Se s [0] è "efficacemente alla fine-1", perché includerlo del tutto? Perché non lasciare che la lunghezza di s si rappresenti da sola? – CPerkins

+0

Sono d'accordo, ma non ho il controllo su quell'input. :) –

risposta

13

Non puoi lanciare un String a un int. Java è fortemente digitato e non vi è alcuna conversione implicita del tipo, come si potrebbe trovare in un linguaggio di scripting.

Per convertire un String in un int, utilizzare una conversione esplicita, ad esempio Integer.parseInt(String).

Tutte le variabili membro e gli elementi degli array sono inizializzati con un valore predefinito. Per i tipi int, il valore è 0. Per i tipi di riferimento (qualsiasi sottotipo di Object), il valore predefinito è null. Le variabili locali non ricevono un valore predefinito, ma il compilatore analizza il codice per garantire che venga assegnato un valore prima che la variabile venga letta. In caso contrario, il codice non verrà compilato.

penso che quello che vuoi è qualcosa di simile:

int[] n = new int[Integer.parseInt(s[0]); 
for (int idx = 0; idx < n; ++idx) 
    n[idx] = Integer.parseInt(s[idx + 1]); 
+0

La parte relativa ai tipi di riferimento dovrebbe essere "tipi di riferimento (qualsiasi * sottotipo * di Oggetto)", poiché "Oggetto []" non è una sottoclasse di "Oggetto", ma è un sottotipo. –

+0

Grazie, dopo aver giocato un po 'con esso ho scoperto che dovevo fare nuovi Integer (s) per lanciarlo. –

+2

@Javier: ancora: non è "casting", cioè "conversione". –

1

Se si inizializza le variabili o oggetti per null prima di utilizzarli,

String myVar1 = null; 
Person bobby = null; 

Si potrebbe confrontare la variabile o dell'oggetto da non nullo,

if (myVar != null) { 
    // myVar has a value. 
} 
+1

solo se inizialmente ed esplicitamente è stato inizializzato su null OR è un oggetto/membro della classe – Yaneeve

+0

Ho modificato la mia risposta, avrei dovuto essere più chiaro con la mia direzione. –

0

È possibile verificare la presenza di null:

int[] n; 
for(String num: s){ 
    if(n == null) { 
     n = new int[(int) num]; 
    } 
    n[n.length] = (int) num; 
} 

Si noti che questo può solo ppen se n è un membro della classe. Se è una variabile locale, il compilatore non ti lascerà fare nulla senza che venga inizializzata.

+3

Questo non verrà compilato: le variabili locali sono * non * impostate su 'null' per impostazione predefinita. (Inoltre, c'è il problema con il cast di int che non funzionerà come notato da @erickson). –

2
int[] n = null; 
for(String num: s){ 
    if(n == null){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 
+0

Grazie. Non sapevo di poter assegnare null a qualsiasi tipo di variabile. –

+0

@ Javier: solo per variabili/campi di tipi di riferimento. Quindi tutto tranne 'int',' boolean', 'char',' short', 'long',' float', 'double'. I tipi di riferimento includono 'Integer',' int [] 'e un numero infinito di altre possibilità. – polygenelubricants

+0

@polygenelubrificanti grazie per il chiarimento, quindi è tutto tranne i tipi nativi, giusto? –

12

Non è possibile controllare se una variabile viene inizializzata nel codice, perché per la lettura definizione da una variabile che potrebbe non sono state inizializzate porta a un errore in fase di compilazione.

è possibile inizializzare la variabile da null e verificare che il valore se la variabile non è un tipo primitivo enull non è un valore valido dopo l'inizializzazione.

Nell'esempio specifico il secondo codice che hai mostrato sarebbe sicuramente più pulito.

1

unica cosa che puoi fare è controllare contro null. Se il codice è all'interno di un metodo, non verrà compilato se non si inizializza. Quindi, se si compila e si esegue si sa che è inizializzato almeno a null e poi effettua il controllo null.

1

Come altri hanno notato, la cosa più vicina a un "modo giusto" per farlo è inizializzare l'array su null.

Su altri punti:

"n [n.length]" genera un "indice di fuori dai limiti" eccezione. Gli array hanno elementi che vanno da 0 a lunghezza-1. In ogni caso, penso che quello che intendevi dire nel primo caso era "n [0]" e nel secondo era "n [i]".

Memorizzare le dimensioni di un array nel primo elemento è probabilmente una cattiva idea. Può essere fatto per un array int, ma sarebbe disordinato in un array String e non funzionerebbe affatto per un array booleano. Anche nel caso int, ora stai mescolando due cose molto diverse nella stessa struttura dati, il che potrebbe essere fonte di confusione. Se la dimensione dell'array è fissa, "length" mantiene comunque la dimensione. Se la dimensione dell'array è variabile e stai pensando che stai per creare un array abbastanza grande e quindi memorizzare la quantità effettivamente utilizzata, è meglio utilizzare ArrayList, che gestisce gli array di dimensioni dinamiche in modo pulito.

+0

Grazie per la risposta. Sì, sono arrivato al n.length sempre restituendo x, non ho capito l'implementazione della lunghezza di java, ora che lo vedo, ha molto senso, dopotutto l'ho inizializzato con x elementi, quindi n.length dovrebbe restituire sempre x. E sì, sono d'accordo, memorizzare la dimensione nel primo elemento è disordinato, ma non ho alcun controllo su questo (sto codificando alcuni esercizi, e questo è l'input previsto) –

+0

Ah, i requisiti non sensoriali portano ancora a un design non sensoriale . Mi ricorda una lezione di economia che ho frequentato all'università. Un capitolo del libro di testo ha parlato dei costi irrecuperabili e ha sottolineato che i costi irrecuperabili sono irrilevanti per i piani futuri. Alla fine del capitolo c'era un esercizio che diceva: "Supponiamo che tu abbia un lavoro e il tuo capo dica:" Non mi interessa quello che ti hanno detto in classe di economia! Voglio che tu prenda in considerazione tutti i nostri costi irrecuperabili o tu 'licenziato!' I costi sommersi ora sono irrilevanti per te? " – Jay

0

Mi sono imbattuto in questo problema, controllando se un int è stato inizializzato. Nel mio programma, era possibile che fosse inizializzato a 0, quindi il controllo di if (int i = 0) non avrebbe funzionato molto bene.

Come soluzione/soluzione, ho creato una variabile boolean che viene impostata quando viene inizializzato lo int. Spero che questo ti aiuti.

Problemi correlati