[JAVA] Eccezioni: chiarimenti [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3272
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

[JAVA] Eccezioni: chiarimenti [RISOLTO]

Messaggioda Blallo » mar gen 31, 2012 19:46

Sto svolgendo un'esercitazione di Java e mi trovo davanti delle eccezioni throwable.
Spulciando la soluzione (è un programma abbastanza semplice) ho cercato di capire qualcosa su come si gestiscono le eccezioni.
In questi due metodi gestisce l'eccezione così:

Codice: Seleziona tutto

  public Persona getPersona(String cf) throws ErrPersonaInesistente {
   Persona p = persone.get(cf);
    if (p == null)
      throw new ErrPersonaInesistente();
    return p;
  }

Stessa cosa qui:

Codice: Seleziona tutto

  public Medico getMedico(String matricola) throws ErrMedicoInesistente {
    if(!medici.containsKey(matricola)){
       throw new ErrMedicoInesistente();
    }
    return medici.get(matricola);
  }

e fin qui tutto fila.
Ma allora perché in questo metodo

Codice: Seleziona tutto

  public void assegnaMedico(String matricola, String cf)
    throws ErrPersonaInesistente, ErrMedicoInesistente {
    Dottore m = (Dottore) getMedico(matricola);
    Paziente p = (Paziente) getPersona(cf);
    m.addPaziente(p);
    p.setMedico(m);
  }

non vengono messi i controlli, con conseguenti "throw new" ecc ecc?
Sarà che sono abituato al C, ma non ci sto capendo una fava secca :)

Grazie a tutti in anticipo.
Ultima modifica di Blallo il mer feb 01, 2012 21:59, modificato 1 volta in totale.
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2676
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.6.3-ck1
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda Ansa89 » mar gen 31, 2012 19:56

Nell'ultimo metodo usi i due metodi precedenti e sono loro che sollevano le eccezioni, quindi non hai bisogno di fare altri controlli.
(Spero di essermi spiegato bene).

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda 414N » mar gen 31, 2012 20:01

Per come ho capito il codice, le due eccezioni (che da qualche parte saranno definite come classi derivate da Exception) vengono generate dai due metodi "getter" (getPersona e getMedico) mentre il metodo assegnaMedico si limita a rilanciarle al proprio chiamante qualora una qualsiasi di esse venisse lanciata da un getter.
Sarà poi il chiamante del metodo assegnaMedico a dover gestire le possibili eccezioni che possono essere lanciate (tramite try/catch) oppure rilanciarle verso l'alto.
PS: nota che il metodo assegnaMedico non controlla che le istanze resituite dagli altri due metodi get siano effettivamente un Dottore e un Paziente (basta controllare tramite l'operatore instanceof), ma ne fa il cast direttamente. Questo può causare una ClassCastException (non dichiarata nella signature di assegnaMedico).

Avatar utente
Blallo
Packager
Packager
Messaggi: 3272
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda Blallo » mer feb 01, 2012 21:58

Grazie a tutti e due, chiarissimi!
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

Vic Steele
Linux 2.6
Linux 2.6
Messaggi: 534
Iscritto il: dom apr 27, 2008 13:46
Nome Cognome: Luigi Caiazza
Slackware: current x86_64
Kernel: 3.0.0
Desktop: Fluxbox / KDE 4.7.0
Distribuzione: Fedora 15
Località: Potenza
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda Vic Steele » gio feb 02, 2012 21:35

414N ha scritto:PS: nota che il metodo assegnaMedico non controlla che le istanze resituite dagli altri due metodi get siano effettivamente un Dottore e un Paziente (basta controllare tramite l'operatore instanceof), ma ne fa il cast direttamente. Questo può causare una ClassCastException (non dichiarata nella signature di assegnaMedico).

Non possiamo dirlo dal solo codice che ha postato, per esempio non c'è bisogno se la struttura dati è tipata genericamente (es.: ArrayList<Medico>, o in questo caso HashMap<String, Medico> dato che ha usato containsKey).

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda 414N » ven feb 03, 2012 9:32

Vic Steele ha scritto:
414N ha scritto:PS: nota che il metodo assegnaMedico non controlla che le istanze resituite dagli altri due metodi get siano effettivamente un Dottore e un Paziente (basta controllare tramite l'operatore instanceof), ma ne fa il cast direttamente. Questo può causare una ClassCastException (non dichiarata nella signature di assegnaMedico).

Non possiamo dirlo dal solo codice che ha postato, per esempio non c'è bisogno se la struttura dati è tipata genericamente (es.: ArrayList<Medico>, o in questo caso HashMap<String, Medico> dato che ha usato containsKey).

Se fosse come dici, il cast a Dottore e Paziente in assegnaMedico sarebbe inutile in entrambi i casi, disponendo di una collezione tipata genericamente.
Dal codice dei due metodi getter si può dedurre che le collezioni sottostanti (probabilmente di tipo Map come giustamente affermato da te) siano dichiarate come collezioni di Persona e Medico e non di Paziente e Dottore (che saranno, quasi sicuramente, sottoclassi delle due precedenti).
Basta che in una delle due collezioni ci finisca o una Persona o un Medico (sempre che non siano classi astratte) e il metodo assegnaMedico lancerà una ClassCastException.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3272
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda Blallo » ven feb 03, 2012 11:13

414N ha scritto:Basta che in una delle due collezioni ci finisca o una Persona o un Medico (sempre che non siano classi astratte) e il metodo assegnaMedico lancerà una ClassCastException.

In effetti Persona e Medico sono interfacce :)
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggioda 414N » sab feb 04, 2012 12:34

jimmy_page_89 ha scritto:In effetti Persona e Medico sono interfacce :)

CVD ;)


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti