Dichiarazioni/Assegnamenti e Garbage Collection, come vengono compilati?

di il
2 risposte

Dichiarazioni/Assegnamenti e Garbage Collection, come vengono compilati?

Salve, sto studiando il linguaggio Java, o meglio, cercando di capire come viene compilato il codice.
Mi sono trovato a svolgere alcuni quesiti che mi sono poco chiari, un paio sulle dichiarazioni/assegnamenti e un paio sul Garbage Collection.

Ecco qui qualche esempio:

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?

class MyExc1 extends Exception { }
class MyExc2 extends Exception { }
class MyExc3 extends MyExc2 { }
public class D1 {
public static void main(String [] argv) {
try {
p();
System.out.print(1);
}
catch( MyExc3 r ) {
System.out.print(2);
throw( new MyExc3() );
}
finally {
System.out.print(3);
}
}
static void p() {
try {
System.out.print(4);
throw( new Exception() );
}
catch( MyExc3 a ) {
}

Altro esempio sull'EXCEPTION:
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?

class MyExc1 extends Exception { }
class MyExc2 extends MyExc1 { }
class MyExc3 extends MyExc2 { }
public class B1 {
public static void main(String [] argv)
throws Exception {
try {
q();
System.out.print(1);
}
catch( MyExc2 h ) {
System.out.print(2);
}
}
static void q() throws Exception {
try {
throw( new MyExc2() );
}
catch( Exception w ) {
System.out.print(3);
}
finally {
System.out.print(4);
}
}
}
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;
ALTRO ESEMPIO. Domanda: Come faccio a determinare la risposta corretta?
1. Date le dichiarazioni:
Object [] a;
Error [] m;
Boolean [] q;
indicare quali dei seguenti assegnamenti sono
corretti a tempo di compilazione.
A. m = (Error []) a;
B. m = a;
C. m = (Error []) q;
D. q = a;
E. q = (Boolean []) m;
Grazie in anticipo per l'eventuale aiuto!

2 Risposte

  • Re: Dichiarazioni/Assegnamenti e Garbage Collection, come vengono compilati?

    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.
  • Re: Dichiarazioni/Assegnamenti e Garbage Collection, come vengono compilati?

    Scusami, nel primo codice per sbaglio ho mancato la parte finale, eccola...
    finally {
    throw( new MyExc3() );
    }
    }
    }
    Cambia qualcosa?

    Per eseguire questo tipo di esercizio, quale "scaletta" devo seguire per la risoluzione?
Devi accedere o registrarti per scrivere nel forum
2 risposte