Pagina 1 di 1

[JAVA] Eccezioni: chiarimenti [RISOLTO]

Inviato: mar 31 gen 2012, 19:46
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.

Re: [JAVA] Eccezioni: chiarimenti

Inviato: mar 31 gen 2012, 19:56
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).

Re: [JAVA] Eccezioni: chiarimenti

Inviato: mar 31 gen 2012, 20:01
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).

Re: [JAVA] Eccezioni: chiarimenti

Inviato: mer 1 feb 2012, 21:58
da Blallo
Grazie a tutti e due, chiarissimi!

Re: [JAVA] Eccezioni: chiarimenti

Inviato: gio 2 feb 2012, 21:35
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).

Re: [JAVA] Eccezioni: chiarimenti

Inviato: ven 3 feb 2012, 9:32
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.

Re: [JAVA] Eccezioni: chiarimenti

Inviato: ven 3 feb 2012, 11:13
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 :)

Re: [JAVA] Eccezioni: chiarimenti

Inviato: sab 4 feb 2012, 12:34
da 414N
jimmy_page_89 ha scritto:In effetti Persona e Medico sono interfacce :)
CVD ;)