luigicoppola ha scritto:
4. Qual’e l’output di questo codice? RISPOSTA: ERRORE A TEMPO DI COMPILAZIONE... La mia domanda è: Perchè? come si determina se c'è un errore di compilazione?
Nel codice che hai postato mancano 2 graffe di chiusura al fondo. Ma il codice si riesce comunque a comprenderlo.
Nel main fai un
catch( MyExc3 r )
All'interno del try c'è qualcosa che fa lanciare MyExc3 (che è una eccezione "checked")? No, non c'è nulla. p() non può lanciare fuori MyExc3, se volesse farlo, DEVE dichiararla con il throws, poiché appunto è una eccezione checked. Il print non c'entra niente con il tuo MyExc3.
In sostanza, nel try nulla lancia MyExc3 e quindi il catch è inutile e il compilatore te lo segnala.
Il
throw( new MyExc3() );
all'interno del catch invece tenta di lanciare fuori dal main un MyExc3. Ma main NON dichiara MyExc3, quindi altro ERRORE.
Il
throw( new Exception() );
all'interno del try di p() tenta di lanciare fuori da p() un Exception che è checked e quindi p() dovrebbe dichiararlo. Non lo dichiara, altro ERRORE.
luigicoppola ha scritto:
16. Qual’e l’output di questo codice? `RISPOSTA: 341 ... La mia domanda: Come viene compilato il programma? Ovvero, come faccio a compilarlo a mente?
Devi sempre tenere a mente che una eccezione "checked" (che deriva da Exception eccetto il sottoramo RuntimeException) deve seguire la regola che si dice informalmente "handle or declare". O la gestisci o la dichiari in modo che esca più a monte. Le eccezioni checked insomma non si possono ignorare, vanno prese in considerazione in un modo o nell'altro.
luigicoppola ha scritto:
ESEMPIO SU DICHIARAZIONE/ASSEGNAMENTO. Domanda: Come faccio a determinare la risposta corretta?
15. Date le dichiarazioni:
Integer [] d;
Boolean [] h;
Object [] w;
indicare quali dei seguenti assegnamenti sono
corretti a tempo di compilazione.
A. d = h;
B. d = (Integer []) h;
C. h = w;
D. h = (Boolean []) d;
E. w = d;
In Java se S è un sottotipo di T, allora S[] è un sottotipo di T[]. Esempio: Integer è un sottotipo di Object, pertanto Integer[] è un sottotipo di Object[]. Un array Integer[] è assegnabile SENZA alcun cast ad una variabile di tipo Object[].
Al contrario, una variabile di tipo Object[] è assegnabile ad una variabile di tipo Integer[] ma richiede un cast esplicito. Il compilatore lo accetta ma è a runtime che viene fatto un check. L'oggetto referenziato dalla variabile Object[] è realmente un Integer[]? Se sì a runtime ok. Altrimenti ti becchi un bel ClassCastException.
Integer e Boolean non hanno nulla a che fare tra di loro, sono slegati. Quindi non è possibile passare da un Boolean[] a un Integer[] (o viceversa), NEMMENO con un cast esplicito. Il compilatore lo SA che non sono in relazione tra di loro.