Códigos ruins:

try {
} catch(ParseException e) {
  throw new RuntimeException();
}

try {
} catch(ParseException e) {
  throw new RuntimeException(
      e.toString());
}

try {
} catch(ParseException e) {
  throw new RuntimeException(
      e.getMessage());
}

try {
} catch(ParseException e) {
  throw new RuntimeException(e);
}

Estes códigos apenas embalam o erro em uma RuntimeException de diferentes maneiras. Nenhum deles realmente fornece uma boa informação ao chamador. O primeiro perde toda a informação. O segundo pode fazer alguma coisa dependendo da informação que toString() gerar. A implementação padrão de toString() lista o nome completamente qualificado da exceção seguido do atributo message. Aninhar muitas exceções irá produzir uma longa e feia string inadequada para o usuário. O terceiro preserva apenas a mensagem, que é melhor do que nada. O último preserva a causa, mas deixa que o atributo message da RuntimeException fique o toString() da sua causa (o que gera o mencionado anteriormente). A mais útil e legível versão é propagar somente a mensagem na RuntimeException e passar a exceção original como causa.

Código melhor:

try {
} catch(ParseException e) {
  throw new RuntimeException(
      e.getMessage(), e);
}