PDA

Visualizza versione completa : Per la felicita di Dav82...JAVA!!


Downloader
15-12-2004, 11.51.16
Ho iniziato a fare un corso su Java, purtroppo essendo completamente a digiuno di questo linguaggio alcune cose che sono state spiegate non mi sono affatto chiare.

1) Cos'è l'interprete? L'interprete nel caso di Java è JVM? E nel caso del C?
2) Cos'è e come funziona il file *.class
3) Cos'è Javac?

Insomma...se potete darmi un po' di info generiche sopratutto per quanto riguarda la fase della complilazione e dell'esecuzione.

Tnx!!! ;)

Dav82
15-12-2004, 12.10.17
Un altro adepto! :D :D :D

Originariamente inviato da Downloader
1) Cos'è l'interprete? L'interprete nel caso di Java è JVM? E nel caso del C?
2) Cos'è e come funziona il file *.class
3) Cos'è Javac?

1) I file .java non vengono compilati in codice macchina come i .c/.cpp, ma vengono tradotti in un formato intermedio detto bytecode, che viene dato in pasto ad un livello intermedio che si chiama interprete; per ogni sistema esiste un interprete Java, scritto in C (a quanto mi risulta per tutti i sistemi) e compilato per quel determinato sistema. L'interprete, ossia la Java Virtual Machine, elabora il bytecode e interpreta (da qui il nome di interprete e linguaggio interpretato) i comandi presenti traducendoli in codice che può girare sul particolare sistema.
2) Ma che cos'è, in buona sostanza, sto bytecode? I file .class sono proprio quei file che vengono dati in pasto alla JVM!
3) Ma come vengono generati i .class a partire dai .java, i file sorgenti che scrivi con il tuo ambiente di sviluppo? Con Javac, che è il Java Compiler della Sun. Ogni IDE poi utilizza questo compilatore integrato nell'ambiente, rendendo trasparante al programmatore la chiamata di javac.

Alla fine della fiera il processo si svolge così:

File .java -> (JavaC) file .class [bytecode] -> (JVM) esecuzione

La JVM può essere chiamata semplicemente con il comando "java nomefile", dove nomefile è il nome del file .class (ma senza estensione) che contiene il main del tuo programma.

Con Java hai anche il concetto di portabilità: mentre scrivendo programmi in C/C++ usi delle funzioni proprie di un determinato sistema, e una volta che hai compilato i file in codice macchina li puoi usare solo su quel sistema (da qui i programmi con versioni differenti per win/linux/mac ecc ecc), con Java puoi "compilare" i tuoi file ottenendo i .class, e questi .class possono essere dati in pasto a una qualsiasi JVM operante su qualsiasi sistema (nb: con beneficio d'inventario eh ;)): i .class sono quindi portabili.
Ovviamente c'è il rovescio della medaglia: un linguaggio interpretato come Java è molto più lento rispetto ad un linguaggio compilato come il C/C++, dovendo - in fase di esecuzione - operare una conversione al volo da bytecode a codice eseguibile.

Bye ;)

Downloader
15-12-2004, 12.25.19
Gia decisamente piu chiaro (Y)

Ora vado a studiarmi tutti gli altri appunti :)

LoryOne
15-12-2004, 12.53.55
Bella domanda questa perchè a risponderti dovremmo esserci in parecchi.
Io cercherò di spiegare la cosa in modo semplice ed intuitivo.

La differenza tra compilatore ed interprete può essere spiegata agrandi linee in questo modo:
Supponi:
1- che ci siano due persone che debbano colloquiare tra loro e che la prima parli italiano mentre la seconda russo.
2- che la prima persona (A) debba impartire ordini alla seconda [B]
3- che la prima persona (A) non sappia nulla di russo

Affinchè la persona (A) possa farsi capire dalla persona [B], è necessario che la prima si appoggi ad un traduttore che trasformi l'italiano in russo, quindi ha bisogno di un interprete (C).
A questo punto non vi è ancora distinzione tra compilatore ed interprete perchè questa fase è comune ad entrambi.

Se (A) parlasse a [B] attraverso (C) in modo che (C) traducesse istantaneamente parola per parola gli ordini di (A) a [B], questo approccio sarebbe interpretato.
Negli interpreti, infatti, il codice viene eseguito sequenzialmente istruzione dopo istruzione in runtime. Ogni istruzione verrebbe quindi tradotta in codice macchina ed immediatamente eseguita.

Se invece (A) parlasse a [B] attraverso una lettera già tradotta da (C) nel linguaggio madre di [B] e a questa consegnata direttamente, a [B] basterebbe leggerla una volta per capire immediatamente tutti gli ordini impartiti da (A) ed eseguire velocemente.
In pratica la traduzione verrebbe eseguita tutta in una volta nel linguaggio comprensibile dal destinatario e questo approccio sarebbe compilato.

Alla luce di quanto sopra esposto risulta chiaro che più ci si avvicina al linguaggio macchina durante la fase di imposizione di direttive, tanto più veloce sarà il PC ad eseguire il compito assegnatogli.

Nel corso degli anni, la disparità di prestazioni tra codice interpretato e compilato si è andata via via restringendo, anche se il divario risulta e risulterà sempre e comunque a favore dei compilatori.

Dav82
15-12-2004, 13.07.21
Lory (Y)


(ogni tanto fa anche il serio questo ragazzo! :D)

LoryOne
15-12-2004, 13.24.37
Sono affetto da bug :D

ceccus
15-12-2004, 14.21.07
Salve,
Tutto giusto...aggiungo soltanto che , ormai da molto tempo, sia la JVM che la VM di Microsoft, "compilano" al volo il codice intermedio (compilazione JiT = Just in Time) e "se lo mettono da parte", pronto per essere "ripesacto" nel caso che venisse rieseguito...
In questo modo , il primo che lancia l'applicazione "paga" in termini prestazionali, tutti gli altri no....ed è questo che ha , di fatto, decretato "il risveglio" dei linguaggi interpretati.....

Ciao !!

Downloader
10-01-2005, 19.33.51
Qualche spiegaziocina:
1) Cos'è il costructor
2) Cos'è il mutator
3) Nell'UML cosa rappresentano le linee tratteggiate e i rombi biachi e neri?

Tnx! ;)

Dav82
10-01-2005, 23.11.51
Originariamente inviato da Downloader
1) Cos'è il costructor

Il constructor, o costruttore (in italiano), è - se vuoi - un "metodo speciale" che permette di creare un'istanza di una classe. La classe è un'entità astratta, il cui codice viene scritto dal programmatore: di ogni classe si possono avere più istanze, ognuna ottenuta tramite un'opportuna invocazione di uno dei metodi costruttori della classe (ebbene sì, una classe può avere anche più di un costruttore).
Per esempio, in un'applicazione per il gioco della dama, ci sarà la classe Pedina, e orientativamente ci saranno 15 istanze di Pedina per il bianco e altre 15 per il nero. Il costruttore è un metodo come gli altri, nel senso che prevede la presenza di parametri, e come risultato dà il riferimento all'oggetto creato.

Originariamente inviato da Downloader
2) Cos'è il mutator

Qua, se vogliamo fare le cose con un po' di rigore, andiamo più sul complicato. Ogni oggetto, inteso come istanza di una classe (e come cacchio si può intendere altrimenti! :D), ha uno stato proprio; questo stato è definito dall'insieme dei valori che in un dato momento sono assunti dagli attributi dell'oggetto stesso. Per esempio, sempre con riferimento alla Pedina di cui sopra, ci potranno essere degli attributi quali

int x; //la coordinata x in cui si trova la pedina
int y; //la coord y
boolean vivo;//false se mangiato dall'avversario


Lo stato di una pedina può essere, ad esempio, {2, 4, true} (e non fare le pulci che le coordinate sono del tipo (lettera, numero)! :p).
Un metodo mutator (o modificatore in italiano) è un metodo che permette di cambiare lo stato di un oggetto. Per esempio può esserci il metodo
muoviAvanti(){
this.y += 1;
}

che, come vedi, cambia lo stato dell'oggetto Pedina su cui è stato invocato il metodo muoviAvanti. Ovviamente il metodo può prendere, a seconda della semantica ad esso associata, dei parametri (in questo caso no, ma per esempio pensa ad un oggetto ContoBancario con il metodo preleva(int prelievo)).

Un piccolo esempio!


public class ContoBancario{

int saldo = 0;
String nomeCorrentista = "";
String cognomeCorrentista = "";
int operazioni = 0;

public ContoBancario (String nome, String cognome){
this.nomeCorrentista = nome;
this.cognomeCorrentista = cognome;
}

/**
*Questo metodo è un OBSERVER (osservatore) poichè non modifica lo stato dell'oggetto
*/
public int saldo saldo(){
return this.saldo;
}

/**
*prelievo => (ammontare < 0), deposito => (ammontare > 0)
*/
public void movimento(int ammontare) throws ContoInRossoException{

if ((saldo + ammontare) < 0)
throw new ContoInRossoException("Stai al verde!");

this.saldo += ammontare;
}
}


e questo è un possibile main per utilizzare sta classe:


public class Downloader(){

public static void main(String[] args){

contoBancario bg = new ContoBancario("Guglielmo", "Cancelli);
System.out.println("Saldo di Bill: " + bg.saldo());
bg.movimento(1000000);
bg.movimento(-5000);
System.out.println("Saldo di Bill dopo 10 WinMe: " + bg.saldo());
}
}


E' un codice assolutamente stupido e schifoso, ma solo per rendere l'idea.
Se stai studiando sul libro della Barbara Liskov, ti sarai accorto che nel metodo movimento c'è il controllo affinché il conto non vada in rosso, e questo equivale a garantire che il RepInvariant (invariante di rappresentazione), dato molto probabilmente dalle condizioni {nomeCorrentista != null AND cognomeCorrentista != null AND saldo >= 0}, sia verificato.

Originariamente inviato da Downloader
3) Nell'UML cosa rappresentano le linee tratteggiate e i rombi biachi e neri?

Secondo la versione di UML che uso io con Poseidon le linee tratteggiate indicano la realizzazione di un'interfaccia, ossia collegano un'interfaccia con una classe che implementa l'interfaccia stessa. Però non penso che sia questo lo standard... per i rombi non saprei, ormai ho visto 3 "standard" UML diversi... se però non ne veniamo a capo, riapro il mio UML Distilled ;)


Spero che il codice sia abbastanza chiaro ;)

Downloader
04-02-2005, 16.31.59
Aspe, siccome io per il momento non ho mai buttato giu una riga di codice mo mi trovo un po' spiazzato.

Ho dei dubbi riguardo la scrittura di un metodo generico e di quelli set, get o costruttore (che poi dovrebbero essere scritti allo stesso modo, o sbalgio?

Ad ogni modo allego qualche righetta di codice, potete controllare se è scritta nel modo corretto visto che dal pc in cui scrivo non ho un compilatore?
tnx! ;)

// Dichiarazione di una classe
public class Javajava
{
public metodoGenerico (/*argomenti*/)
{
// codice

// va alla fine il return, e se si a che serve?

}

// Questo è il main, ovvero l'entry point della jvm
public static void main(String[] args)
{
System.out.println("Javaaaaaaa");

}

}

Dav82
04-02-2005, 18.32.40
Originariamente inviato da Downloader
Aspe, siccome io per il momento non ho mai buttato giu una riga di codice mo mi trovo un po' spiazzato.

Enno no no no! :D
Appena si studia una roba, bisogna metterla in pratica, tanto più con lo studio di un linguaggio di programmazione: prove stupide, che non servono a niente, ma da fare ;)

Ho dei dubbi riguardo la scrittura di un metodo generico e di quelli set, get o costruttore (che poi dovrebbero essere scritti allo stesso modo, o sbalgio?

Esattamente. Tutti i metodi hanno la stessa struttura:

<modificatore>* <tipo_ritornato> <nome_metodo> ( <argomenti> )

dove "*" significa: zero o più (anche se la cosa è un tantino più complicata)

public metodoGenerico (/*argomenti*/)
{
// codice
// va alla fine il return, e se si a che serve?

}

Ogni metodo deve avere il tipo di ritorno: se non ritorna nulla, devi comunque mettere void, altrimenti il compilatore fa lo schizzinoso ;)

Per i modificatori, quali private, public, static... puoi metterli come non metterli, il compilatore interpreterà l'assenza di modificatori come il modificatore di default, ma questo non può essere fatto per il tipo ritornato.
Tutto il resto è corretto.

visto che dal pc in cui scrivo non ho un compilatore?

:eek: :eek: :eek:

SACRILEGIO!

In ogni computer deve esserci un compilatore Java! :D

Downloader
05-02-2005, 13.16.21
Scusa un altra cosa:

quando voglio salvare un valore che inserisco in input col c++ uso il comando cin, in java che comando c'è?

Downloader
15-02-2005, 22.18.21
ULTRA URGENTE!!

Ho bisogno di un consiglio su un buon libro per Java (i suoi fondamenti) che avete magari anche usato e con il quale vi siete trovati bene.

Se avesse anche un po' di esempi sarebbe anche meglio.

Io anche se un po' di fretta ne avevo notato una della Apogeo con copertina blu che non mi pareva malaccio.

;)

Dav82
15-02-2005, 22.34.25
Io ho usato il Thinking in Java, di Bruce Eckel, lo puoi trovare su internet con Google, il file si chiama TIJ3.pdf o qualcosa del genere :) Unica cosa è che è in inglese ;)

Per il resto ho visto i Deitel & Deitel, il libro base e quello avanzato... quello base è più che altro per chi non sa cos'è un ciclo e simili, è proprio molto di base... mentre il secondo ha qualche aspetto più interessante.
Secondo me sono un po' pedanti con gli esempi, ma è un mio modo di vedere.

Altri non te ne saprei consigliare, non ne ho letti :)

Downloader
15-02-2005, 22.42.26
Azz, se non fosse per l'inglese! :mad:

Purtroppo avrei bisogno di un qualcosa in italiano che mi spieghi anche gli aspetti piu semplici del java perchè oggi mi sono accorto di non saperne proprio nulla :(

Tnx! Poi ti faro sapere!

Dav82
15-02-2005, 22.53.13
I Deitel li trovi in italiano :)
Qualsiasi libreria universitaria non fuffa (ossia una libreria per ingegneria :cool: ) li tiene in catalogo.

Se ti serve una cosa che parte proprio dalla base cmq i Deitel vanno benissimo ;)

Downloader
15-02-2005, 22.54.43
Li cerchero domani! :)

Dav82
15-02-2005, 22.57.27
Originariamente inviato da Downloader
Li cerchero domani! :)

Ah... ehm... come dire... in zona universitaria li puoi anche trovare che costano meno, molto meno... capisc' ammè ;)

Downloader
19-02-2005, 17.11.54
Originariamente inviato da Dav82
Io ho usato il Thinking in Java, di Bruce Eckel, lo puoi trovare su internet con Google, il file si chiama TIJ3.pdf o qualcosa del genere :) Unica cosa è che è in inglese ;)


L'ho visto ieri in italano, pero credo prendero Fondamenti di Java 2 di Herbert Schildt perccè oltre al prezzo mi pare spiegato piu semplicemente di altri.

http://www.lukeonweb.net/immagini/libri/34.jpg

Downloader
08-03-2005, 20.03.51
Altra cosuccia:

mi potresti spiegare la logica della variabile this?

Cioè essenzialmente a che mi serve?
E' obbligatorio metterla?

Dav82
08-03-2005, 20.19.01
La parola chiave "this" si riferisce all'oggetto corrente.
Serve principalmente per disambiguare fra parametri formali (quelli nella signature del metodo) e attributi di classe.

Scusa sono di fretta faccio un esempio semplice:


private class Dav82{

private boolean figo = true; :D
private String residenza = "";
private String a = "";
private String b = "";
private String c = "";

public void setResidenza (String residenza){
this.residenza = residenza;
}

public void foo (String x, String y, String z){
this.a = x;
this.b = y;
this.c = z;
}
}


Come vedi, con l'uso di this riesci a distinguere fra il valore passato come parametro al metodo e l'attributo della classe.
Poi, come vedi in foo, serve anche per dare una certa eleganza al codice, in modo che sia subito evidente quando ti riferisci ad un attributo della classe... o meglio, a ma piace di più così.

Mi frulla nella mente che c'è anche un altro uso di this ma... non so se mi frulla e basta, oppure se c'è veramente :mm:

Downloader
14-03-2005, 19.14.47
Altra cosuccia (che scocciatore eh?):

Quando voglio eliminare un oggetto basta che la variabile di referenze la uguagli a null, ma il metodo gc() a che mi serve??

Dav82
14-03-2005, 21.06.50
Originariamente inviato da Downloader
Altra cosuccia (che scocciatore eh?):

Quando voglio eliminare un oggetto basta che la variabile di referenze la uguagli a null, ma il metodo gc() a che mi serve??

Allora, in Java non esiste la possibilità di deallocare una zona di memoria con puoi fare in C con la free(), perchè non puoi interagire direttamente con la memoria.

Nell'ambiente di esecuzione è attivo un thread di garbage collecting che si occupa di liberare la memoria occupata da oggetti verso i quali non esistono più riferimenti: in sostanza se non è più possibile riferirsi ad un determinato oggetto, questo viene preso in consegna dal garbage collecting (e ponendo il tuo riferimento == null tu fai in modo che possa succedere questo).

Se tu chiami System.gc() invochi il metodo di garbage collecting ma NON sei sicuro che avvenga effettivamente la free() della memoria, in quanto la chiamata a questo metodo è interpretata dalla JVM alla stregua di un consiglio: "Uè, se hai voglia, fai pure la garbage collection!" ma niente più. L'operazione di garbage collection è a totale discrezione della JVM :)

p.s: Downloader.isScocciator() == false :p

Downloader
22-03-2005, 19.55.05
Perchè l'input di una stringa non va?
Invece usando la classe Console per i valori numerici tutto ok.

void popolaNominativi()
{
System.out.println("Numero libri da inserire: ");
num = Console.readInt("");

for (i=num;i<max;i++)
{
System.out.println("Autore: ");
//lista[i].autore = Input.readLine();
System.out.println("Genere: "+lista[i].genere);
//lista[i].genere = Input.readLine();
System.out.println("ID: "+lista[i].Id_libro);
lista[i].Id_libro = Console.readInt("");
System.out.println("Casa editrice: "+lista[i].casa_editrice);
//lista[i].casa_editrice = Input.readLine();
System.out.println("Anno di pubblicazione: "+lista[i].anno_pubblicazione);
//lista[i].anno_pubblicazione = Input.readLine();
System.out.println("Costo (in euro): "+lista[i].costo);
lista[i].costo = Console.readInt("");
}
}

Downloader
23-03-2005, 19.51.03
Come non detto :)

Downloader
25-04-2005, 14.18.48
Concetto di ASTRAZIONE

Allora, una classe si dice astratta quando non puo generare oggetti.
Per astrarre una classe oltre alla dichiarazione all'inizio della classe (es: abstract public class Classe) deve avere anche un metodo o un parametro dichiarato abstract.

Nella sottoclasse invece che erditera la classe astratta devo riscrivere tutti i metodi della classe padre senza pero codice (es: public provaUno(){ }).
Ma ci devo mettere anche il costruttore della classe padre??

E' giusto o sbaglio qualcosa??

Dav82
25-04-2005, 14.52.55
Originariamente inviato da Downloader
Allora, una classe si dice astratta quando non puo generare oggetti.
Per astrarre una classe oltre alla dichiarazione all'inizio della classe (es: abstract public class Classe) deve avere anche un metodo o un parametro dichiarato abstract.[QUOTE]

Esattamente.
Non puoi generare oggetti della classe astratta perchè in effetti quella classe non è completa, le mancano dei pezzi.

[QUOTE]Nella sottoclasse invece che erditera la classe astratta devo riscrivere tutti i metodi della classe padre senza pero codice (es: public provaUno(){ }).
Ma ci devo mettere anche il costruttore della classe padre??

No no, non devi riscrivere i metodi (e quindi il costruttore, che ninet'altro è che un metodo un po' speciale) della classe da cui erediti. E' come una normale classe che eredita da un'altra, solo che devi implementare i metodi che nella classe padre erano dichiarati abstract; puoi anche scegliere di non implementarli (o di implementarne solo qualcuno ma non tutti) e quindi devi dichiarare abastract anche questa classe.

Ovviamente puoi anche riscrivere metodi della classe padre che non erano abstract, anche qui come in una normale gerarchia di ereditarietà (per esempio per specializzarne il comportamento).

Ancora ovviamente, anche dopo che hai "coperto gli abstract" con delle classi figlie non puoi creare oggetti della classe abstract di partenza, poichè quella è e rimane abstract :)

Ciao ;)

Downloader
25-04-2005, 18.09.48
Altra cosuccia: (oggi mega studiata di java)
vedo molto spesso che sono definiti metodi di tipo set e get.

Ma sti set e get cosa devono farmi capire del metodo in questione??
E sopratutto come mi comporto nel caso debba scrivere del codice la dentro??

Dav82
25-04-2005, 19.17.11
Originariamente inviato da Downloader
vedo molto spesso che sono definiti metodi di tipo set e get.

Ma sti set e get cosa devono farmi capire del metodo in questione??
E sopratutto come mi comporto nel caso debba scrivere del codice la dentro??

In una classe normalmente ci sono degli attributi, che altrettanto normalmente hanno visibilità private, cioè possono essere modificati solo all'interno della classe stessa, oppure senza nessun modificatore (detti anche friendly, ma questo dipende dalla letteratura che leggi), cioè possono essere modificati all'interno della classe e di eventuali classe che ereditano dalla stessa.
Ma è possibile che un classe B abbia bisogno che i valori degli attributi della classe A vengano modificati (pensa al solito esempio dell'oggetto Correntista che, prelevando, deve modificare il valore degli attributi dell'oggetto ContoCorrente): B non può dire scrivere una cosa tipo A.attributo1 = nuovoValore o anche solo variabileDiB = A.attributo3, perchè otterebbe un errore a tempo di compilazione, visto che B non può accedere (quindi né in lettura né in modifica) agli attributi di A in quanto questi sono private

Allora A fornisce dei metodi get e set, per poter rispettivamente leggere e scrivere il valore di un attributo: ovviamente A in questi metodi può fare dei controlli etc etc...

I tipici metodi get e set sono:


public class A{
private int nome;

public int getNome(){
return this.nome;
}

public void setNome(int nome){
this.nome = nome;
}
}


Se A è particolarmente sensibile al proprio nome, nel metodo set, prima di fare l'assegnamento del nuovo valore passato come parametro, potrà controllare che non sia troppo offensivo... :D :p

Questo in generale e nella pratica comune...


Se poi guardi i programmi scritti da certi Yugoslavi (chiedi a Google: Davide Bianchi, storie dalla sala macchine) non saranno certamente fatti così :D

Ciao :)



edit: sti tag del cavolo! :p

Downloader
25-04-2005, 20.10.24
tnx! ;)

Downloader
09-06-2005, 11.16.06
Eccezioni:
ti dovrei fare delle domande che poi potrei trovare nel compito:
1) dov'è che si verifica una eccezione? nel blocco try o catch? e quando c'è una eccezione che succede al blocco try?

Dav82
09-06-2005, 13.55.21
Originariamente inviato da Downloader
Eccezioni:
ti dovrei fare delle domande che poi potrei trovare nel compito:
1) dov'è che si verifica una eccezione? nel blocco try o catch? e quando c'è una eccezione che succede al blocco try?

Una eccezione può verificarsi in qualunque punto del codice, basta che ci sia un'istruzione che la lanci :)

Detto questo, la domanda vuole farti dire che un'eccezione si verifica nel blocco try (che significa: tu "prova" ad eseguire il codice) e viene poi gestita/catturata nel più vicino blocco catch.

Cosa succede nel blocco try?
Bene, vengono ignorate tutte le istruzioni seguenti quella che genera l'eccezione, e si salta al più vicino blocco catch per la gestione dell'eccezione.

Qualche esempio va! :)


try{
classe1.metodoUno(); //genera l'eccezione MiaException
classe1.metodoDue();
} catch (MiaException e){
System.out.println("Ehilà, eccezione!" + e.toString());
}
System.out.println("Fuori dal trycatch");


questo è il caso più semplice, la prima chiamata genera eccezione, l'esecuzione si sposta nel blocco catch e poi NON ritorna indietro, ma prosegue sequenzialmente all'interno del metodo, cioè in questo caso esegue la seconda println.


try{
try{
classe1.metodoUno(); //genera l'eccezione LevelOneException
classe1.metodoDue();
} catch (LevelTwoException e){
System.out.println("2nd level!" + e.toString());
} catch (AnotherException e){
//do nothing
}
} catch (LevelOneException e){
System.out.println("1st level!" + e.toString());
}
System.out.println("Fuori dal trycatch");


Fai conto che LevelTwoException erediti da LevelOneException, cioè sia una sua classe figlia.

In questo caso, nel blocco try/catch più interno, viene lanciata l'eccezione di livello 1, ma il catch immediatamente presente gestisce solo quella di livello 2 o sequenzialmente AnotherException, che mettiamo non abbia relazioni con le altre Exception, quindi non viene eseguito; si esce quindi dal blocco try più interno perchè non si è riusciti a gestire l'eccezione, e si analizza il blocco catch del livello try/catch più esterno: questo sì che va bene, poichè catcha :p proprio l'eccezione che serve a noi :) (poteva catchare anche una superclasse di LevelOneException, ovvero se LevelOneException ereditava da LevelZeroException, e in questo blocco try si fosse catchata LevelZeroException, sarebbe andato bene cmq: vige la regola solità sul type checking classica di Java ;))


Come vedi, si tratta proprio di rilancio (throw) delle eccezioni, da un blocco interno ad un altro più esterno. L'operazione che infatti accade quando viene sollevata un'eccezione, è proprio quella di
throw new TipoDiEccezione(parametri);

Di più: in un blocco catch puoi fare quello che vuoi: stampare, manipolare variabili, chiamare metodi a piacimento, insomma tutto quello che puoi fare normalmente, e nessuno ti vieta che venga lanciata una nuova eccezione, o che magari tu stesso, per tua decisione, rilanci un'eccezione, magari anche la stessa che hai ricevuto!


try{
classe1.metodoUno(); //genera l'eccezione MiaException
classe1.metodoDue();
} catch (MiaException e){
System.out.println("Ma va come sono idiota, sbaglio sempre" + e.toString());
errori = errori + 1;
throw e;
}
System.out.println("Fuori dal trycatch");

Come vedi, nel blocco catch si stampa semplicemente un avviso per il povero programmatore, si aumenta un counter per tener conto di quanto è idiota il programmatore, e poi si rilancia la stessa eccezione; nel blocco catch in pratica sono state eseguite solo delle operazioni "di servizio", demandando la gestione vera e propria ad un altro blocco catch più esterno.




Avete parlato di blocchi finally? :)

Downloader
09-06-2005, 14.30.17
Si, dei finally qualcosa so.

aspe che c'ho qualche altra bella domandina.

1) quando nella signature scrivo piu eccezioni le devo scrivere in ordine come poi staranno nel corpo del metodo o no?
2) Definizione java exception:
-inaspettata situazione che se non gestita correttamente terminera il programma.
- inaspettato codice scritto dal programmatore.
Ora visto che il sole mi rimbecillisce c'ho pure bisogno della conferma che la prima risposta è quella esatta.
3) (la metto inglese senno in italiano viene brutta tradotta da me :p)
What must be done when throwing an integer as an exception ?
-integers cannot be thrown
-declare integers as throwable
-import the exception class
-encapsulate the integer hanlder.

Io c'ho messo la seconda.

Altra cosa: il metodo longSeek() non esiste vero?

Dav82
09-06-2005, 14.51.22
Originariamente inviato da Downloader
1) quando nella signature scrivo piu eccezioni le devo scrivere in ordine come poi staranno nel corpo del metodo o no?

No, assolutamente, le puoi mettere nell'ordine che vuoi :)
E devi mettere solo le eccezioni che possono essere lanciate "fuori" dal metodo.
Per spigerami meglio: se nel tuo metodo viene lanciata un'eccezione MiaException, e in tutti i casi in cui viene lanciata ne viene pure fatto un catch, senza rilanciarla, effettivamente il metodo non la lancia, almeno per agli effetti esterni, osservabili da un chiamante.
Ancora di più: sei obbligato a mettere tutte le eccezioni checked, mentre quelle unchecked (ossia quelle che ereditano da RuntimeException) puoi metterle come non metterle: un esempio tipico è la NullPointerException, che può essere segnalata nella signature oppure no, a scelta del programmatore.


2) Definizione java exception:
-inaspettata situazione che se non gestita correttamente terminera il programma.
- inaspettato codice scritto dal programmatore.
Ora visto che il sole mi rimbecillisce c'ho pure bisogno della conferma che la prima risposta è quella esatta.

Batte forte il sole, eh? :D
Sì sì è la prima :p


(la metto inglese senno in italiano viene brutta tradotta da me :p)
What must be done when throwing an integer as an exception ?
-integers cannot be thrown
-declare integers as throwable
-import the exception class
-encapsulate the integer hanlder.

Io c'ho messo la seconda.

Sbagliato.
La risposta corretta è la prima.
Possono essere "throwati" (:D) solo gli oggetti che ereditano dalla classe Throwable: se guardi nella specifica del linguaggio Java, la classe Integer implementa le Comparable e Serializable, ma NON Throwable.
Non puoi neanche dichiarare la classe Throwable, non ha senso, è già una classe definita da Java, nun ze po ffa!

In C invece si può fare, ma Java è superiore :o

Altra cosa: il metodo longSeek() non esiste vero?

In quale classe? :)

Downloader
09-06-2005, 15.09.54
Originariamente inviato da Dav82
In quale classe? :)

Trowable.

Io non l'ho trovata ne sul mio libro ne su goooogle, ad una domanda c'è una risposta che parla di sto metodo ma non avendolo mai sentito l'ho considerato sbagliato.

Dav82
09-06-2005, 15.17.16
Ragazzo!
Non dirmi che non hai una copia delle Java API!!! :eek:

Tragedia! Orrore! Sacrilegio! :D

Vai subito qua (http://java.sun.com/j2se/1.5.0/download.jsp) e fai il download della J2SE Documentation, è un ordine! :D

E' uno zippone (42MB) di file html che contengono il javadoc delle classi fornite da Java.

Cmq nella classe Throwable non c'è questo metodo, né nelle classi da cui eredita (java.lang.Object, la madre di tutte le classi) né nelle interfacce che implementa (java.lang.Serializable)

Scarica lo zippone... è importante averlo e saperlo usare, senza non si può programmare in Java ;)

Downloader
09-06-2005, 15.20.36
ehm...beh...ecco, con il 56kappino non posso eccedere in downlodamenti troppo pesanti, ma appena vado a scuola non manchero di rallentare la linea sior :D

Dav82
09-06-2005, 15.30.42
Certo che uno che si chiama Downloader e ha la 56k.... :D :D :D

Ah ecco, mi ero dimenticato del blocco finally.

Il blocco finally può essere messo nell'architettura try/catch in posizione finale, in modo da avere una serie try/catch/finally, ma non è obbligatorio averlo, come invece per il catch, in quanto è un componente opzionale.
Che fa sto finally?
Viene eseguito COMUNQUE, qualunque cosa accada nell'esecuzione del codice. C'è un'eccezione nel blocco try? Bene, le istruzioni nel blocco finally realavito al blocco try in esame verranno comunque eseguite, anche in presenza di un'eccezione, anche se il blocco catch rimanda da un'altra parte, fa tutto quello che vuole, le istruzioni nel finally vengono eseguite.
C'è una sola eccezione alla regola: se viene chiamata la System.exit() beh, non c'è nulla da fare, il programma termina e il tuo blocco finally te lo scordi :p

C'è anche un'altra eccezione ma... qui sta al programmatore: non far andare in loop il programma! Anche in questo caso il blocco finally, ovviamente, te lo scordi :p

Downloader
09-06-2005, 18.28.26
Altre domandine, poi basta fino a stanotte :p

what should be done when code contains statements that can throw exception?
-Let the operating system handle all exception
-declare the exception in a throw cluase or place the statement in a try/catch/finally block <--
-include code from the handler class to catch the exception
-ingnore all exceptions

what is purpose of try block?
-the try block is used to catch unwnated types of object
-the try block contains code that may generate an exception <--
-the try block throws exceptions in order to test exception handling of the system
-the try block is used to debug code that has not been proven and may contain exception

what is the correct definition of an exception handler?
-the main section of code for the class that executes
-a section of code that contains the instructions concerning what do to with an exception <--
-a section of code in which an exception may occur
-a section of code that executes when a button is clicked

con <-- indico la mia risposta

tnx! ;)

Dav82
10-06-2005, 02.14.33
Originariamente inviato da Downloader
what should be done when code contains statements that can throw exception?
-Let the operating system handle all exception
-declare the exception in a throw cluase or place the statement in a try/catch/finally block <--
-include code from the handler class to catch the exception
-ingnore all exceptions

Giusto (Y)
Precisazione: questo vale per le eccezioni checked (come le chiama Barbara Liskov), mentre per quelle unchecked non è necessaria questa procedura: si può usare e nessuno dice niente, ma volendo il programmatore può non mettere né il try/catch né l'indicazione nella signature del metodo.

Cosa sono eccezioni checked e unchecked?
Le unchecked sono delle sottoclassi di RuntimeException, ossia delle eccezioni che sono tipiche dell'esecuzioni quale NullPointerException, mentre eccezioni che denotano malfunzionamenti gravi sono normalmente checked, ossia ereditano da Exception ma NON da RuntimeException. Per le eccezioni già definite da Java la scelta è ovviamente fissata, per il resto sta al programmatore agire cum grano salis

what is purpose of try block?
-the try block is used to catch unwnated types of object
-the try block contains code that may generate an exception <--
-the try block throws exceptions in order to test exception handling of the system
-the try block is used to debug code that has not been proven and may contain exception

Giusto (Y), come già detto prima

what is the correct definition of an exception handler?
-the main section of code for the class that executes
-a section of code that contains the instructions concerning what do to with an exception <--
-a section of code in which an exception may occur
-a section of code that executes when a button is clicked

Giusta anche questa (Y) ovviamente. In sostanza è la definizione di un blocco catch.

:)

Downloader
10-06-2005, 10.17.33
Ok, ora mi metto a studiare le collections.

Dav82
10-06-2005, 14.43.31
Originariamente inviato da Downloader
Ok, ora mi metto a studiare le collections.

Bravo, sono da conoscere :)

Downloader
10-06-2005, 22.08.16
Ed ecco puntuali alcune domandine ine ine ine:
The phrase “re-arranging the elements in a collections on some random order” correctly defines which term?
-Sorting <--
-shuffling
-duplication
-adding

Which statements best describes a map?
-A map is a list
-a map is an ordered set of objects
-a map is a set that allows repetitions
-a map is a set of pairs, mapping a key value with an object <--

Which of the following Collections framework storage methods requires the most memory for storage of a group of objects?
-array <--
-linked-list
-tree
-hash table

Dav82
10-06-2005, 22.18.25
Originariamente inviato da Downloader
Ed ecco puntuali alcune domandine ine ine ine:
The phrase “re-arranging the elements in a collections on some random order” correctly defines which term?
-Sorting <--
-shuffling
-duplication
-adding

Scartando le ultime due che sono palesemente sbagliate, bisogna capir bene cosa vuol dire quel "random": se si intende "riarrangiare e mettere a casaccio, facendo una permutazione senza seguire un determinato criterio" allora la risposta è "shuffling" che vuol dire appunto questo; se invece l'ordine è prestabilito (alfabetico ecc ecc, cmq con una chiave, magari multipla) allora "sorting" è senza dubbio quella da preferire.

Which statements best describes a map?
-A map is a list
-a map is an ordered set of objects
-a map is a set that allows repetitions
-a map is a set of pairs, mapping a key value with an object <--

Giusto (Y)

Which of the following Collections framework storage methods requires the most memory for storage of a group of objects?
-array <--
-linked-list
-tree
-hash table

Direi anche io, con un array semplicemente usi delle locazioni di memoria contigue, senza dover usare alcun altro sistema di identificazione dei dati; con una linked-list devi avere dei puntatori ai vari elementi, con un albero devi tenere memoria dei figli (e dei padri e magari dei fratelli [siblings]). Per una hash table bisogna definire una tecnica implementativa, cioè una struttura dati, poichè può essere costruita in molti modi, ma sicuramente c'è cmq dell'overhead rispetto ad un semplice array.
Direi quindi che la tua risposta è giusta (Y)

Ops, edit: avevo letto "less" e non "most".

E cmq bisogna sempre vedere cosa si vuole sapere: ci sono molti modi per valutare lo spazio occupato; per esempio se hai da tenere 3 oggetti, con un array di 3 elementi occupi sicuramente meno spazio che con una linked-list di 3 elementi; se però non conosci a priori la quantità di elementi, con una linked-list non sprecherai mai posizioni, in quanto la puoi allungare/accorciare quanto, quando e come vuoi, mentre un array dovrà essere sovradimensionato... diciamo che la domanda, a mio modo di vedere, è mal posta :)

Dav82
10-06-2005, 22.49.50
Tu su che base hai dato la risposta?

Sei sicuramente più fresco di me sulle collection, così ripasso qualcosa pure io :p

Downloader
10-06-2005, 23.09.18
Originariamente inviato da Dav82
Tu su che base hai dato la risposta?

Sei sicuramente più fresco di me sulle collection, così ripasso qualcosa pure io :p

Io le ho iniziate oggi a studiare e non è che mi siano chiarissime :p

Ma su che domanda ti riferisci in particolare?

p.s. ne arrivano altre a breve :)

Dav82
10-06-2005, 23.11.37
All'ultima :)


però non vale modificare il messaggio mentre io ti sto rispondendo :o :p

Downloader
10-06-2005, 23.13.27
Originariamente inviato da Dav82
All'ultima :)


però non vale modificare il messaggio mentre io ti sto rispondendo :o :p

Vabbe, io ti stavo ripondendo sulla prima, poi m'è venuto il dubbio :)

Downloader
10-06-2005, 23.16.55
Ho risposto array perchè mi è venuto in mente che se voglio per esempio aggiungere un elemento nell'array devo prima riversare tutti gli elementi dell'array piu quello/i nuovo/i (ovviamente in un certo limite) in un nuovo vettore, occupando piu memoria di quanta non se ne occupi per esempio con il liked-list.

Lo so che con la domanda centra poco, ma in mancanza di altre idee...

Dav82
10-06-2005, 23.21.18
Originariamente inviato da Downloader
Ho risposto array perchè mi è venuto in mente che se voglio per esempio aggiungere un elemento nell'array devo prima riversare tutti gli elementi dell'array piu quello/i nuovo/i (ovviamente in un certo limite) occupando piu memoria di quanta non se ne occupi per esempio con il liked-list.

Lo so che con la domanda centra poco, ma in mancanza di altre idee...

Questo in effetti riguarda più il tempo: c'è sempre un trade-off spazio/tempo: che vor dì??? :p Vuol dire che, normalmente, per risolvere un problema con una tecnica A ci metterai X tempo e K memoria, mentre con una tecnica B ci metterai più d X tempo e meno di K memoria: in un ambito migliori, nell'altro peggiori, è così in tutti i problemi informatici :)

Sinceramente non saprei cosa rispondere, a questa domanda in particolare. Magari dopo mi riguardo la specifica di queste due collezioni e ti do una risposta su basi più solide :)

Downloader
10-06-2005, 23.57.05
Which statements about the Map interface are true?(4 risp)

-Objects that implements the Map interface can be used to store and manage a collection of objects using hash table storage technology <--

-HasTable and HashMap implement the Map interface <--

-Object that implement the Map interface provide methods to add objects using key values

-Object that implement the Map interface have a put() method that inserts a key and value pair into the map. If the key already exist then the insertion is rejected <--

-Objects that implements the Map interface have a get() method that returns the value associated with a given key or null if the key does not exist in the map <--

-The hashCode method should not be overridden in objects that will be used in a HashMap collection.



What type of methods are part of the collection interface? (3 risp)

-add and remove methods <--

-random object creation methods

-count object method <--

-iterator methods <--

-group methods




Which of the following phrases are true <for both arrays and collections?

-a single object representing a group of objects <--

-deal with many types of objects

-fixed size or capacity

-easily sorted

Downloader
11-06-2005, 00.46.36
Ultima per stanotte, prometto :p

What can be said about the collection framework classes and the interfaces upon which they have build? (??????)

-the collection framework classes allow the user to write their own collections methods.

-the framework classes override the abstract interface methods and add additional concrete methods to facilitate management of collections

-the collections interfaces may be used directly without the need to override any methods at all
-every interface has a corresponding class which should be then used by the programmer

-only those methods which the programmer needs to use must be overridden in the class which implements a collection interface

Downloader
11-06-2005, 15.39.35
Originariamente inviato da Downloader
Ed ecco puntuali alcune domandine ine ine ine:
The phrase “re-arranging the elements in a collections on some random order” correctly defines which term?
-Sorting
-shuffling
-duplication
-adding


E invece è shuffling

Davvvvvv ma dove sei??? :D

Dav82
11-06-2005, 18.52.08
Originariamente inviato da Downloader
E invece è shuffling

T'avevo detto io che bisognava capire ben quel "random" :D :p



Mo leggo eh, prima devo finire alcune cosine poi ti dico :)

Downloader
11-06-2005, 19.24.20
Sono entrambe sbagliate, cosi dovrebbero andar meglio

What type of methods are part of the collection interface? (3 risp)

-add and remove methods <--

-random object creation methods

-count object method

-iterator methods <--

-group methods <--


Which of the following phrases are true <for both arrays and collections?

-a single object representing a group of objects

-deal with many types of objects

-fixed size or capacity

-easily sorted <--

Dav82
12-06-2005, 04.55.37
Ehm, scusami, oggi sono stato pigro, fra studiare, lavorare, ca@@eggiare sul Forum, non ho guardato le tue domande :(


Which statements about the Map interface are true?(4 risp)

-Objects that implements the Map interface can be used to store and manage a collection of objects using hash table storage technology <--

-HasTable and HashMap implement the Map interface <--

-Object that implement the Map interface provide methods to add objects using key values

-Object that implement the Map interface have a put() method that inserts a key and value pair into the map. If the key already exist then the insertion is rejected <--

-Objects that implements the Map interface have a get() method that returns the value associated with a given key or null if the key does not exist in the map <--

-The hashCode method should not be overridden in objects that will be used in a HashMap collection.

1) Vera: c'è una classe fornita direttamente da Java)
2) Vera (sempre riscontrabile dallo zippone :p)
3) Falsa: nella specifica di Map non c'è traccia di metodi del genere;
4) Falsa: direttamente dalla Documentation (lo zippone :p): "If the map previously contained a mapping for this key, the old value is replaced by the specified value."
5) Vera; piccola precisazione: "A return value of null does not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key to null. The containsKey operation may be used to distinguish these two cases."
6) eh??? troppo tardi per capire sta cosa! :D

Probabile cmq che la 4 la diano come Vera :)

What type of methods are part of the collection interface? (3 risp)

-add and remove methods <--
-random object creation methods
-count object method <--
-iterator methods <--
-group methods

Esatto (Y) (se tu avessi lo zippone.... :p)

Which of the following phrases are true <for both arrays and collections?

-a single object representing a group of objects <--
-deal with many types of objects
-fixed size or capacity
-easily sorted

1) vera: sono degli insiemi di oggetti;
2) falsa: una Collection può avere oggetti di classi differenti, mentre un oggetto di classe Array può referenziare solo oggetti di uno stesso tipo;
3) falsa: un oggetto Array ha dimensioni fissate a priori, una Collection no;
4) falsa: sinceramente bisognerebbe intendersi sull'easely, cmq in generale no;

Dav82
12-06-2005, 04.59.06
Originariamente inviato da Downloader
Sono entrambe sbagliate, cosi dovrebbero andar meglio



Mi sono basato sulle tue risposte originarie, cmq se guardi la specifica di Collection, i suoi metodi sono:

add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray :)

Dav82
12-06-2005, 05.22.51
Originariamente inviato da Downloader
What can be said about the collection framework classes and the interfaces upon which they have build? (??????)

-the collection framework classes allow the user to write their own collections methods.

-the framework classes override the abstract interface methods and add additional concrete methods to facilitate management of collections

-the collections interfaces may be used directly without the need to override any methods at all
-every interface has a corresponding class which should be then used by the programmer

-only those methods which the programmer needs to use must be overridden in the class which implements a collection interface

Traduzione, prima di tutto!

Che cosa si può dire delle classi del framework Collection e delle interfacce sulle quali queste (le classi del framework) sono costruite?

1) Vera: alla fin fine ogni classe può essere utilizzata come base di partenza per una classe customizzata!
2) Vera: si può sindacare sul fatto che per i metodi di un interfaccia si fa override nel senso strutturale del termine (non si usa la definizione del metodo data nella classe "padre" ma quella data nella classe "figlia") ma non nel senso più comune (cioè quello di ridefinire una implementazione già data, che per le interfacce NON c'è, in quanto un'interfaccia è solo un insieme di signature di metodi), ma la risposta è da dare assolutamente per buona senza la minima ombra di dubbio
3) Falsa: le interfacce NON sono istanziabili! Quindi NON possono essere usate... un'interfaccia è fatta per essere implementata da una classe, altrimenti che interfaccia è? :D La risposta sarebbe vera se al posto di "interfaces" ci fosse "classes": le classi fornite dal framwork Collection NON sono abstract, e quindi possono essere istanziate e usate tranquillamente :)
4) Vera: vedi 3
5) Falsa: per poter usare (istanziare) una classe, questa deve NON essere abstract, cioè tutti i metodi devono essere implementati; poi ovviamente quelli che non servono possono essere implementati semplicemente ricopiando la signature con nessuna istruzione nel corpo del metodo, ma devono essere ricopiati nella classe, altrimenti la stessa deve essere dichiarata abstract, e quindi non istanziabile (usabile).


Spero di non aver scritto vaccate o robe incomprensibili :D

Sono le 4 e mezza di notte :D

Ciao ;)

Downloader
15-06-2005, 15.59.29
Devo fare l'ultimo esame entro domani qua in Irlanda, e lo devo fare sui thread (cosa sentita una volta sola e mai capita)
Editato...

Downloader
15-06-2005, 16.14.43
Editato...

Downloader
15-06-2005, 16.16.08
Questa potrebbe essere l-'ultima volta che scasso le ***** con java per quest'anno.

tnx! ;)

Dav82
15-06-2005, 16.22.24
Non so quado riuscirò a risponderti, sono tantine e ho un mucchio di cose da fare :S

Downloader
16-06-2005, 16.11.02
Vabbe, tanto credo che forse una volta tornato posso fare tutto lo stesso.

Ciao e grazie :)

Dav82
16-06-2005, 16.13.23
Scusami, ho avuto veramente la giornata piena, e nei pochi momenti liberi ho spammato qua sul forum :p

Downloader
17-06-2005, 15.47.53
Don't worry, si puo fare anche dopo e poi che ti scusi??

;)

Downloader
29-06-2005, 01.22.52
Ahhhhhhh che bello di nuovo nottate a fare java, mi mancavano tanto :D :D

Allora, molte delle vecchie domande sono state risolte (spero), pero c'ho un problemino con una codifica (argomento thread, argomento mai fatto in vita mia):

//codice
syncronized(System.out)
//codice

e mi chiede:
What is accomplished alla riga...(dove c'è syconronized)
-the system allows only one word to be printed from each thread
-the system puts a lock on the output until the thread completes
-the system locks the console until all threads have completed
-the system cannot lock the output so the program crashes.