Prefácio
No processo de aprender Java, acredito que todo mundo aprendeu o capítulo sobre exceções e não vou falar sobre as características básicas e o uso de exceções aqui. O que é uma exceção? Não sei como todo mundo entende. Meu entendimento é muito simples, isto é, situações anormais. Por exemplo, agora sou um homem, mas tenho algo exclusivo para as mulheres. Na minha opinião, isso é definitivamente uma anormalidade e eu não posso suportar. Eu acredito que todos podem entender e usá -lo corretamente.
No entanto, se o processamento e o uso de exceções básicas ópticas forem insuficientes, não é assustador ocorrer no trabalho. Às vezes, é necessário usar exceções para impulsionar o processamento dos negócios. Por exemplo: ao usar um banco de dados com restrições exclusivas, se um dados duplicado for inserido, ele poderá ser processado capturando a exceção de restrição exclusiva duplicateKeyException. Nesse momento, o estado correspondente pode ser jogado na camada de chamada na camada do servidor, e a camada superior o processará de acordo com o estado correspondente. Portanto, às vezes as exceções são um método de direção para o negócio.
Algumas pessoas gerarão a exceção depois de capturar a exceção. Gostaria de saber se os alunos cuidadosos notaram algo. Qual é a exceção de saída?
Aqui está uma exceção comum:
java.lang.arithmeticexception: / por zero em estufa.ExceptionTest.testException (excepçãoTest.java:16) em sun.reflelect.nativemethodaccessorImpl.invoke0 (método nativo) em sun.refLECT.nativeModaccArcAmpl.Invoke (nativen) at Sun.reflect.nativeModAcaccArmPl.InVoke (Native) at Sun.reflect.nativeModAcaccArmPl.inVoke (Nativen) at Sun.reflect.nativeModAcaccArmPl.invoke (nivok sun.reflelect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorimpl.java:25) em java.lang.reflect.method.invoke (métod.java:597) em org.junit.runners.model.frameworkmethodymethodshodshods.597) em org.junit.runners.model.frameworkmethodshodshodshods $ 1.eTringModModsModsModshodshodshodshodshods.597). em org.junit.internal.runners.model.reflectiveCallable.run (refleteCallable.java:15) em org.junit.runners.model.frameworkmethod.invokeexplosive (estrutura org.junit.internal.runners.statements.invokemethod.Evaluate (Invokemethod.java:20) em org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) org.junit.runners.blockJunit4ClassRunner.Runchild (blockjunit4classrunner.java:50) em org.junit.runners.parentrunner $ 3.runner (parentrunner.java:193) em orul.junit.runners.parrunner.java:193) em orlenrunit.runners.parrunner $ 1.StRunner. org.junit.runners.parentrunner.runchildren (parardrunner.java:191) em org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) em org.junit.runners.arentrunner $ 2.evaluate (parardrunner8) org.junit.runners.parentrunner.run (parardrunner.java:236) em org.junit.runner.junitcore.run (junitcore.java:157) em com.Intellij.junit4 com.Intellij.rt.execution.junit.idereatestrunner $ repetidor.startrunnerwithargs (ideatestrunner.java:47) em com.intellij.rt.execution.junit.junitstarter.PrearStarrestersAndStart (junitstarter2 AosT.junit.junitstarter.PreestrestreamsAndStart (junitstarter.junit: com.Intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Uma exceção de ponteiro nulo:
Java.lang.NullPointerException em Greenhouse.ExceptionTest.TestException (ExceptionTest.java:16) em Sun.reflect.nativeMethodAccessorImpl.inVoke0 (Método Nativo) em Sun.reflelect.nativeMethodaccLeacplEmpl.invoke (nativemethAckeCkenchenchenchenchenchenchenchences. sun.reflelect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorimpl.java:25) em java.lang.reflect.method.invoke (métod.java:597) em org.junit.runners.model.frameworkmethodymethodshodshods.597) em org.junit.runners.model.frameworkmethodshodshodshods $ 1.eTringModModsModsModshodshodshodshodshods.597). em org.junit.internal.runners.model.reflectiveCallable.run (refleteCallable.java:15) em org.junit.runners.model.frameworkmethod.invokeexplosive (estrutura org.junit.internal.runners.statements.invokemethod.Evaluate (Invokemethod.java:20) em org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) org.junit.runners.blockJunit4ClassRunner.Runchild (blockjunit4classrunner.java:50) em org.junit.runners.parentrunner $ 3.runner (parentrunner.java:193) em orul.junit.runners.parrunner.java:193) em orlenrunit.runners.parrunner $ 1.StRunner. org.junit.runners.parentrunner.runchildren (parardrunner.java:191) em org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) em org.junit.runners.arentrunner $ 2.evaluate (parardrunner8) org.junit.runners.parentrunner.run (parardrunner.java:236) em org.junit.runner.junitcore.run (junitcore.java:157) em com.Intellij.junit4 com.Intellij.rt.execution.junit.idereatestrunner $ repetidor.startrunnerwithargs (ideatestrunner.java:47) em com.intellij.rt.execution.junit.junitstarter.PrearStarrestersAndStart (junitstarter2 AosT.junit.junitstarter.PreestrestreamsAndStart (junitstarter.junit: com.Intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Você encontrou um recurso que a saída da exceção é o local em que a exceção ocorre com precisão e muitas chamadas do processo de execução são impressas posteriormente. De onde vem essas informações? Esta informação é obtida na pilha. Ao imprimir o log de exceção, essas informações de chamada serão obtidas na pilha. É claro que é bom poder localizar com precisão exceções, mas às vezes quando consideramos o desempenho do programa e alguns requisitos, às vezes não precisamos imprimir completamente essas informações e obter as informações correspondentes da pilha de chamadas do método, que é o consumo de desempenho. Para alguns programas com requisitos de alto desempenho, podemos melhorar completamente o desempenho do programa nesse aspecto.
Então, como evitar a saída dessas informações da pilha? Em seguida, exceções personalizadas podem resolver este problema:
Primeiro, a exceção automática precisa herdar a RunTimeException e, em seguida, reescrever o método FillInstackTrace e ToString. Por exemplo, eu defino uma exceção da AppException abaixo:
pacote com.green.monitor.common.exception; importar java.text.messageFormat;/*** classe de exceção personalizada*/classe pública AppException estende o RUNTimeException {private boolean Issuccess = false; chave de string privada; informações privadas de string; public AppException (chave de string) {super (key); this.Key = key; this.info = key; } public AppException (tecla String, string message) {super (messageFormat.Format ("{0} [{1}]", chave, mensagem)); this.Key = key; this.info = mensagem; } public AppException (mensagem da string, chave da string, string info) {super (message); this.Key = key; this.info = info; } public boolean ISSUCCESS () {return issuccess; } public string getKey () {return Key; } public void setKey (chave de string) {this.key = key; } public string getinfo () {return info; } public void setInfo (string info) {this.info = info; } @Override Public Throwable FillInstackTrace () {return th This; } @Override public string tostring () {return messageFormat.format ("{0} [{1}]", this.key, this.info); }}Então, por que reescrever os métodos de FillInstackTrace e ToString? Vamos primeiro olhar para qual é o código -fonte.
classe pública RunTimeException estende a exceção {estática final serialversionuid = -7034897190745766939l; /** Construa uma nova exceção de tempo de execução com <code> null </code> como sua* mensagem de detalhe. A causa não é inicializada e pode ser posteriormente * inicializada por uma chamada para {@link #Initcause}. */ public RunTimeException () {super (); } /** Construa uma nova exceção de tempo de execução com a mensagem de detalhes especificados. * A causa não é inicializada e pode ser inicializada por uma chamada * para {@link #Initcause}. * * @param mensagem a mensagem de detalhes. A mensagem detalhada é salva para * recuperação posterior pelo método {@link #getMessage ()}. */ public RunTimeException (string message) {super (mensagem); } /** * Construa uma nova exceção de tempo de execução com a mensagem de detalhes especificada e * causa. <p> Observe que a mensagem detalhada associada a * <code> Causa </code> é <i> não </i> incorporou automaticamente na mensagem de detalhes desta exceção de tempo de execução. * * Mensagem @param A mensagem detalhada (que é salva para recuperação posterior * pelo método {@link #getMessage ()}). * @param causa a causa (que é salva para recuperação posterior pelo método * {@link #getcause ()}). (A <tt> null </tt> O valor é * permitido e indica que a causa é inexistente ou * desconhecida.) * @Since 1.4 */ public RUNTimeException (mensagem de string, causa de lançamento) {super (mensagem, causa); }/** Construções Uma nova exceção de tempo de execução com a causa especificada e uma * mensagem detalhada de <tt> (causa == null? Este construtor é útil para exceções de tempo de execução * que são pouco mais do que invólucros para outros arremessos. * * @param Causa A causa (que é salva para recuperação posterior pelo método * {@link #getCause ()}). (A <tt> null </tt> O valor é * permitido e indica que a causa é inexistente ou * desconhecida.) * @Since 1.4 */ public RuntimeException (causa de arremesso) {super (causa); }}O RunTimeException herda a exceção, mas chama apenas o método da classe pai e não faz nenhuma outra operações. Então, vamos continuar a ver o que está acontecendo em exceção?
A Exceção da classe pública estende a Throwable {estática final serialversionuid = -3387516993124229948L; /*** Construa uma nova exceção com <code> null </code> como sua mensagem de detalhes. * A causa não é inicializada e pode ser posteriormente inicializada por uma chamada * para {@link #Initcause}. */ public Exception () {super (); } /*** Construa uma nova exceção com a mensagem de detalhes especificados. A causa * não é inicializada e pode ser posteriormente inicializada por * uma chamada para {@link #Initcause}. * * @param mensagem a mensagem de detalhes. A mensagem detalhada é salva para * recuperação posterior pelo método {@link #getMessage ()}. */ Public Exception (string message) {super (mensagem); } /** * Construa uma nova exceção com a mensagem de detalhes especificada e * causa. <p> Observe que a mensagem detalhada associada a * <code> causa </code> é <i> não </i> incorporou automaticamente em * a mensagem de detalhes desta exceção. * * Mensagem @param A mensagem detalhada (que é salva para recuperação posterior * pelo método {@link #getMessage ()}). * @param causa a causa (que é salva para recuperação posterior pelo método * {@link #getcause ()}). (A <tt> null </tt> O valor é * permitido e indica que a causa é inexistente ou * desconhecida.) * @Since 1.4 */ Exceção pública (mensagem de string, causa de arremesso) {super (mensagem, causa); }/** * Construa uma nova exceção com a causa especificada e uma mensagem detalhada * de <tt> (causa == null? * Este construtor é útil para exceções que são pouco mais do que * wrappers para outros arremessos (por exemplo, {@link * java.security.privilegedactionException}). * * @param Causa A causa (que é salva para recuperação posterior pelo método * {@link #getCause ()}). (A <tt> nulo }}Como pode ser visto no código -fonte, o método da classe pai também é chamado diretamente na exceção. Como o RunTimeException, eu realmente não fiz nada. Então, vamos dar uma olhada no que está acontecendo em Throwable:
public class Throwsable implementa serializável {public throwable (string message) {FillInstackTrace (); detalheMessage = mensagem; } /*** preenche o rastreamento da pilha de execução. Este método registra nesse * <code> Throwable </code> Informações do objeto sobre o estado atual de * os quadros da pilha para o thread atual. * * @return Uma referência a esta instância <Code> Throwable </code>. * @See Java.lang.THOWALLE#PrintStackTrace () */ public sincronizado nativo atirável FillInstackTrace (); /** * fornece acesso à programação às informações de rastreamento da pilha impressas por * {@link #PrintStackTrace ()}. Retorna uma matriz de elementos de rastreamento de pilha, * cada um representando um quadro de pilha. O elemento Zeroth da matriz * (assumindo que o comprimento da matriz é diferente de zero) representa a parte superior da pilha *, que é a última invocação do método na sequência. Normalmente, * este é o ponto em que esse jogável foi criado e jogado. * O último elemento da matriz (assumindo que o comprimento da matriz é diferente de zero) * representa a parte inferior da pilha, que é a primeira invocação do método * na sequência. * * <p> Algumas máquinas virtuais podem, em algumas circunstâncias, omitir uma ou mais quadros de pilha do rastreamento da pilha. No caso extremo, * uma máquina virtual que não possui informações de rastreamento de pilhas sobre * Este arremessável pode retornar uma matriz de comprimento zero deste método *. De um modo geral, a matriz retornada por esse método * conterá um elemento para cada quadro que seria impresso por * <tt> printStackTrace </tt>. * * @Return Uma matriz de elementos de rastreamento de pilha representando o rastreamento da pilha * pertencente a este lançável. * @since 1.4 */ public StackTraceElement [] getStackTrace () {return (StackTraceElement []) getourStackTrace (). clone (); } private sincronizado StackTraceElement [] getourStackTrace () {// Inicialize o rastreamento da pilha se esta for a primeira chamada para este método se (Stacktrace == null) {int de profundidade = getStackTraceTepth (); StackTrace = novo StacktraceElement [profundidade]; para (int i = 0; i <profundidade; i ++) Stacktrace [i] = getStackTraceElement (i); } retornar StackTrace; } /** * Retorna o número de elementos no rastreamento da pilha (ou 0 se o rastreamento da pilha * não estiver disponível). * * Proteção do pacote para uso por SharedSecrets. */ nativo int getStackTraceThTh (); /*** Retorna o elemento especificado do rastreamento da pilha. * * Proteção do pacote para uso por SharedSecrets. * * Índice de @param Índice do elemento para retornar. * @Throws IndexOutOfBoundSexception Se <Tt> ÍNDICE <0 || * índice> = getStackTraceThTH () </tt> */ nativo StackTraceElement getStackTraceElement (int index); /*** Retorna uma breve descrição deste jogável. * O resultado é a concatenação de: * <ul> * <li> A classe {@linkplain #getName () nome} da classe deste objeto * <li> ":" (um cólon e um espaço) * <li> o resultado de invocar o {@link @GetLIledMessage} *. <tt> null </tt>, então apenas * o nome da classe é retornado. * * @return Uma representação de string deste jogável. */ public string tostring () {string s = getClass (). getName (); String message = getLocalizedMessage (); return (mensagem! = nulo)? (s + ":" + mensagem): s; }Do código -fonte, ele está quase no final do arremesso. O método FillInstackTrace () é um método nativo. Este método chamará o idioma C subjacente, retornará um objeto jogável, o método da tostragem e retornará uma breve descrição do jogável. No método GetStackTrace e GetourStackTrace, o método nativo GetStackTraceElement é chamado. Este método retorna as informações especificadas do elemento de pilha, para que esse processo deve consumir desempenho. Em seguida, podemos reescrever o método do totetring e preencher o método de tracejamento em exceções personalizadas e produzi -lo diretamente sem obter informações de exceção da pilha. Isso não é relativamente "pesado" para o sistema e o programa, e é uma maneira muito boa de otimizar o desempenho. Então, como é se ocorrer uma exceção personalizada? Por favor, veja abaixo:
@Test public void testException () {try {string str = null; System.out.println (str.Charat (0)); } Catch (Exceção e) {tiro a nova AppException ("000001", "Exceção de ponteiro nulo"); }}Então, quando a exceção for anormal, o sistema imprimirá nossas informações de exceção personalizadas:
000001 [Exceção do ponteiro NULL] Processo terminado com o código de saída -1
Portanto, é particularmente conciso e otimiza o desempenho do programa do sistema, tornando o programa menos "pesado"; portanto, é necessário o sistema com requisitos especiais de desempenho. Apresse -se e personalize sua própria exceção!
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.