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

.