Un try/catch no tendría que hacer falta si compruebas bien las condiciones de finalización del bucle y los valores leidos.
Igualmente el bucle que muestras podría escribirse así: 
Código:
 NovaTasca t;
while((t=(NovaTasca) in3.readObject())!=null)
{
 if(t.p==null)
 {
  System.out.println(t.Id+t.Nom);
 }
 else
 {
  System.out.println(t.Id+t.Nom+"("+t.p+")");
 }
}
  Aparte de eso, una solución sencilla si siempre has de leer todos los objetos es meterlos todos en un objeto List, al escribirlos, y al leerlos solo has de leer un objeto, de clase List, y luego puedes leerlos como cualquier lista con un Iterator, por ejemplo. 
Y no olvides cerrar los streams apropiadamente 

. 
S! 
PD: EL problema que te da sin el try/catch no se cual es, ya que "peta" no es pista suficiente 

.