PDA

View Full Version : [java] menu testuale a scelta numerica,come nn far inserire lettere?


marius84
29-05-2009, 11:40
ciao a tutti,

avendo un menu testuale su terminale, di questo tipo:

SCEGLI OPERAZIONE:

1) bho
2) ciao
3) nnso
4)ESCI

l'utente deve scegliere 1-2-3 o 4.. se immetto un qualcods diversa da una cifra lancia questa eccezione...
Exception in thread "main" java.util.InputMismatchException


come posso risolvere con un blocco try-catch? oppure con cosa?
il menu è dentro un while-switch, quindi se inserisco qualsiasi numero fuori da 1-4, non da errore e riscrive il menu di nuovo in attesa di una scelta giusta...

wingman87
29-05-2009, 11:43
Posta il codice se possibile.

marius84
29-05-2009, 12:13
public static void main (String args[]) throws IOException,FileNotFoundException{

Scanner in=new Scanner(System.in);
boolean quit = false;


while(!quit){
out.println("\n1) Prenotazione");
out.println("2) Gestione (riservato ai docenti");
out.println("3) Esci");

int scelta=in.nextInt();
in.nextLine();

switch(scelta){

case 1:
*****
break;
case 2:
*****
break;


case 3: break;
}
if(scelta==3) quit=true;
}
out.println("Uscita dal sistema eseguita");
}

il problema è in grassetto, se inserisco lettere mi da inputmismatchexception

wingman87
29-05-2009, 12:31
Io la gestirei così:
int scelta;
try{
scelta=in.nextInt();
}catch(InputMismatchException e){
scelta=4;
}

al posto della riga in grassetto. Dovrebbe andare.

Dimension7
29-05-2009, 17:10
Oppure una cosa così:


boolean corretto=false;
int scelta;
while(!corretto){
try{
corretto=true;
scelta=in.nextInt();
}catch(InputMismatchException e){
corretto=false;
}
}


Se non ho fatto errori grossolani, questo ti permette di chiedere all'infinito il numero, finchè non viene inserito quello giusto.

marius84
29-05-2009, 20:14
mmm grazie ragazzi.. provo i codici e vi dirò...

ho un'altra domanda... :P

nel sotto menu di GESTIONE ho:

INSERISCI
CHIUDI
ESPORTA...

scegliendo una di queste 3 scelte, ho un elenco di esami su cui operare..

ad esempio:

1)programmazione
2)fisica
3)algoritmi
ecc...

se inserisco un numero fuori da quell'intervallo mi crasha il programma con l'eccezione:
IndexOfBoundException..
l'elenco esami è salvato in un arraylist..

public boolean inserisciEsame(int scelta,String data,int maxIscr){

Insegnamento ins=scelte.get(scelta-1);
Esame es=new Esame(ins.getNome(),data,ins.getDocente(),maxIscr);
if(esami.addEsame(es)){
es.setInsg(ins);
return true;
}
return false;
}

Dimension7
29-05-2009, 21:03
In generale quando hai a che fare con input dell'utente che possa produrre errori puoi fare o con una try-catch inserita in un while, così che finchè non viene prodotto un input corretto "catcha" l'errore, oppure più semplicemente metti un while all'inizio, poi quando hai l'input corretto prosegui nel programma.
Per esempio, immaginando di dover prendere un indice per l'array a che sia corretto:


int[] a=...
while(true){
int input=sistema per ottenere l'input
if(input>=0 && input<a.length;){
break;
}
}
utilizzi l'input nel programma, sicuro che ha un valore corretto


Comunque metologicamente è più corretto usare il try catch, anche se penso che come robustezza i due metodi sono allo stesso livello.

marius84
01-06-2009, 11:49
Io la gestirei così:
int scelta;
try{
scelta=in.nextInt();
}catch(InputMismatchException e){
scelta=4;
}

al posto della riga in grassetto. Dovrebbe andare.

Oppure una cosa così:

Codice:

boolean corretto=false;
int scelta;
while(!corretto){
try{
corretto=true;
scelta=in.nextInt();
}catch(InputMismatchException e){
corretto=false;
}
}

Se non ho fatto errori grossolani, questo ti permette di chiedere all'infinito il numero, finchè non viene inserito quello giusto.

così invece mi fa inserire sia un numero che una lettera,
però se inserisco una lettera,il cursore va a capo ed inserendo altre lettere o numeri non va niente, li richiede all'infinito..

così catcha l'errore ma va in loop e mi stampa sempre il menu "prenota-gestione-esci"