2013-06-27 4 views
12

Sto creando un'app con una griglia di immagini con testo e ognuna apre un'attività diversa. Funziona bene ma solo per scopi di progettazione, voglio sostituire il mio if-else statements con switch statements (che presumo di poterlo fare) tuttavia non funziona. In questo momento il mio codice di lavoro per impostare l'etichetta su ogni immagine è:Se non funziona, non cambiare

if(position == 0) 
     textView.setText(R.string.zero); 
    else if(position == 1) 
     textView.setText(R.string.one); 
    else if(position == 2) 
     textView.setText(R.string.two); 
    else if(position == 3) 
     textView.setText(R.string.three); 
    else if(position == 4) 
     textView.setText(R.string.four); 
    else if(position == 5) 
     textView.setText(R.string.five); 
ect.... 

voglio usare:

switch(position) 
case 0: 
    textView.setText(R.string.zero);  
case 1: 
    textView.setText(R.string.one); 
case 2: 
    textView.setText(R.string.two);  
case 3: 
    textView.setText(R.string.three); 
case 4: 
    textView.setText(R.string.four);  

ma quando l'ho fatto mai etichetta è stata l'ultima che ho definito (nel mio esempio sarebbe "quattro"). Ho anche un codice simile per ogni oggetto per avviare un diverso intent con la variabile position ma che fa il contrario e rende ogni intento uguale al primo. La mia sintassi è errata o non funzionerà per la mia situazione?

+32

È necessario 'break;' dopo ogni istruzione in un 'case', altrimenti si scorre verso il basso, in modo avrete sempre l'ultimo caso. –

+1

@SotiriosDelimanolis ha espresso una risposta – Blackbelt

+0

Grazie a tutti! Non mi rendevo conto che avevi bisogno di un 'break' quando non hai un' return' –

risposta

62

È necessario break; dopo ogni istruzione in un case, altrimenti l'esecuzione scorre verso il basso (tutti i casi inferiori a quello desiderato verranno anche chiamati), in modo da ottenere sempre l'ultimo caso.

switch(position) { 
case 0: 
    textView.setText(R.string.zero); 
    break; 
case 1: 
    textView.setText(R.string.one); 
    break; 
case 2: 
    textView.setText(R.string.two); 
    break; 
case 3: 
    textView.setText(R.string.three); 
    break; 
case 4: 
    textView.setText(R.string.four); 
    break; 
} 

Ecco il official tutorial spiegare quando e quando non usare break;.

+0

Ora hai il mio +1. Stavo per indicare esattamente cosa hai aggiunto di recente su ogni caso che viene chiamato. – Gamb

+5

+1 per la spiegazione e il collegamento. – Maroun

+79

Un interruttore di caso ha 23+ upvotes? –

7

Questa è la soluzione. È necessario utilizzare break per evitare di passare attraverso ogni singolo caso:

switch(position) 
case 0: 
    textView.setText(R.string.zero);  
    break; 
case 1: 
    textView.setText(R.string.one); 
    break; 
case 2: 
    textView.setText(R.string.two); 
    break; 
case 3: 
    textView.setText(R.string.three); 
    break; 
case 4: 
    textView.setText(R.string.four);  
    break; 

consiglierei di leggere la documentazione di Oracle circa la switch statement.

5

È necessario utilizzare l'istruzione break dopo le operazioni caso cassa. In una dichiarazione switch-case se non utilizzare un'istruzione break poi tutti i casi, dopo che uno specifico sarà eseguito anche

case 0: 
    textView.setText(R.string.zero);  
    break; 
9

Utilizzando un'istruzione break dopo ogni caso dovrebbe risolvere il problema. Vorrei anche usare una dichiarazione di default anche dopo l'ultimo caso.

16

È necessario break; dopo ogni ramo:

switch (position) { 
    case 0: 
     textView.setText(R.string.zero); 
     break; // <-- here 
    // etc 
} 

usi legittimi switch quando non si break esisti, questi sono chiamati through caduta; o perché return o throw:.

switch (someNumber) { 
    case 0: 
     return 0; 
     // no need for break here 
    case 1: 
     throw new IllegalArgumentException(); 
     // no need to break here 
    case 2: 
     System.out.println("Oh, I got two!"); 
     // fall through 
    case 3: 
     return 3; 
    default: 
     System.out.println("Meh") 
     // No need to break: last possible branch 
} 

return -1; 

tornerà 3, anche se si immette 2.

Ma per il resto è necessario break.

+3

+1 per menzionare il fall-through. –

+2

È sempre un buon modo per mettere una pausa alla fine del default: dato che qualcuno potrebbe aggiungere un altro caso sotto di esso e ottenere una caduta inaspettata. – Gray

5

Non dimenticare di mettere break; dopo ogni caso: come quella:

switch(position){ 
case 0: 
    textView.setText(R.string.zero);  
    break; 
case 1: 
    textView.setText(R.string.one); 
    break; 
case 2: 
    textView.setText(R.string.two);  
    break; 
case 3: 
    textView.setText(R.string.three); 
    break; 
case 4: 
    textView.setText(R.string.four); 
    break; 
} 
3

Negli istruzioni switch-caso, è necessario mettere break; dopo ogni caso .

switch(position){ 
case 0: 
    textView.setText(R.string.zero);  
    break; 
case 1: 
    textView.setText(R.string.one); 
    break; 
case 2: 
    textView.setText(R.string.two);  
    break; 
case 3: 
    textView.setText(R.string.three); 
    break; 
case 4: 
    textView.setText(R.string.four); 
    break; 
default: 
    System.out.println("not available"); 
} 

Inoltre è necessario mettere default: finalmente, perché quando tutti i casi sono sbagliato quel tempo esegue di default: l'azione.

Nella dichiarazione non si è dimenticato di interrompere; e azione predefinita.

+0

È sempre un buon modo per mettere una pausa alla fine del default: dato che qualcuno potrebbe aggiungere un altro caso sotto di esso e ottenere una caduta inaspettata. – Gray

1

Ogni istruzione di interruzione termina l'istruzione di switch allegata. Il flusso di controllo continua con la prima istruzione che segue il blocco switch. Le istruzioni di interruzione sono necessarie perché senza di esse, le istruzioni nei blocchi di interruzioni ricadono: Tutte le istruzioni successive all'etichetta del caso corrispondente vengono eseguite in sequenza, indipendentemente dall'espressione delle etichette caso successive, finché non viene rilevata un'istruzione di interruzione.

Switch è più veloce di if-else

Linea di fondo: di default è opzionale (funziona come istruzione else in switch), Break è obbligatoria.

Fatto interessante: non si vedrà alcun errore di compilazione, anche se si è dimenticato di inserire l'istruzione break.

1

Il switch ha bisogno di un break con in ogni caso. Ma nel tuo caso potrebbe essere molto più semplice definendo un array come mostrato di seguito.

String values = {R.string.zero, R.string.one, R.string.two, ... }; 

Utilizzare questa per popolare textView: textView.setText(values[position]);