[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.
Rispondi
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 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]

Messaggio da Blallo »

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 1 feb 2012, 21:59, modificato 1 volta in totale.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [JAVA] Eccezioni: chiarimenti

Messaggio da Ansa89 »

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: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggio da 414N »

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: 3302
Iscritto il: ven 12 ott 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

Messaggio da Blallo »

Grazie a tutti e due, chiarissimi!

Vic Steele
Linux 3.x
Linux 3.x
Messaggi: 534
Iscritto il: dom 27 apr 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

Messaggio da Vic Steele »

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: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggio da 414N »

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: 3302
Iscritto il: ven 12 ott 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

Messaggio da Blallo »

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 :)

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [JAVA] Eccezioni: chiarimenti

Messaggio da 414N »

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

Rispondi