Pergunta

Eu sei

throw new Exception();

tem uma sobrecarga bastante grande, pois cria uma pilha completa, etc.
Faz

throw new Throwable();

apresentar o mesmo problema? Esse comportamento é herdado, ou jogar um arremesso tem uma sobrecarga menor (o no)?

EDITAR
De um analista Ponto de vista, um usuário inserindo a senha errada é uma exceção à ordem de execução normal de um programa. Então, se eu tiver:

public Session newSession() {  
  validate_user_and_password();   
}

Jogar uma UserNotValidexception soaria correto de um analistas ponto de vista.
Retornando null ou 0 Parece incorreto se o seu código tiver uma abstração muito boa. Eu só queria saber se poderia realmente implementar isso no código ou se precisava deixá -lo para a teoria.

Há uma boa diferença entre a exceção da programação do ponto de vista e a exceção do analista de ponto da visão.

Nota: eu dei um exemplo muito simples e bobo, este não é exatamente o meu caso.
Nota 2: Eu sei que retornando null Seria a coisa comum, mas sou obrigado a ter o código de OO devidamente abstraído e, pessoalmente, não vejo mal nisso.

Foi útil?

Solução

Throwable Também cria um empilhamento quando é criado. De Java docs para Throwable:

O Throwable contém um instantâneo da pilha de execução de seu segmento no momento em que foi criado.

Então Exception e Throwable.

Se você estiver usando exceções para "eventos excepcionais" (como deveria estar), não deve se preocupar demais com a sobrecarga de uma pilha. Um evento excepcional ocorre raramente no código de execução. Portanto, as exceções não devem afetar o desempenho do código normal de maneira significativa.

Outras dicas

Não, você precisa da sua própria subclasse para evitar esse efeito.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

Isso cria uma instância de exceção que não preencherá o rastreamento da pilha (a criação de exceções delegadas para fillInStackTrace para realmente preencher o rastreamento da pilha) e, portanto, é barato de criar.

Com a compilação JIT, na verdade ainda não é o caso de haver muita coisa ouvida em jogar um Exception em java. Mas jogando um Throwable Não é muito diferente, pois você também terá um rastreamento de pilha lá.

Se você estiver interessado, existe um artigo muito interessante chamado "Manipulação de exceções de Java eficiente na compilação just-in-time" (link). Não é uma leitura leve, mas bastante informativa.

Você nunca deveria estar jogando ou pegando Throwable. O escopo da exceção é muito grande.

Como afirmado anteriormente, as exceções devem ser usadas apenas quando necessário, ou seja: em circunstâncias excepcionais e devem ser específicas para a situação que as gerou. À parte, pegando um Throwable implica uma série de exceções, como OutOfMemoryException. Um erro dessa magnitude não pode ser recuperado (facilmente) e não deve ser tratado pelo desenvolvedor.

Throwable é a classe dos pais de exceção. assim Exception class é herdado de Throwable.

Throwable vs. Exception

Exceção de Java

Como o @Mangodrunk disse: "Throwable é a superclasse de exceção e erro".

Você pode olhar para o código -fonte das duas classes para ver que Exception não faz nada além de expor os mesmos construtores que Throwable. Toda a carne e, portanto, sobrecarga, vive em Throwable.

Ainda que Exception introduziu algumas despesas gerais adicionais, seria uma otimização clara para usar Throwable em vez de. Use a ferramenta certa para o trabalho, não coopte a ferramenta errada apenas porque é mais leve.

java.lang.Exception estende -se java.lang.Throwable, então é a mesma sobrecarga. De Javadoc:

A classe jogável é a superclasse de todos os erros e exceções no idioma Java. Somente objetos que são instâncias desta classe (ou uma de suas subclasses) são lançados pela máquina virtual Java ou podem ser lançados pela declaração de arremesso Java. Da mesma forma, apenas esta classe ou uma de suas subclasses pode ser o tipo de argumento em uma cláusula de captura.

Instâncias de duas subclasses, erro e exceção, são convencionalmente usadas para indicar que ocorreram situações excepcionais. Normalmente, essas instâncias são criadas recentemente no contexto da situação excepcional, de modo a incluir informações relevantes (como dados de rastreamento de pilha).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top