{"componentChunkName":"component---src-templates-blog-post-js","path":"/java-iniciante-pt10/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Tratamento-de-erros-antigamente\" style=\"position:relative;\">Tratamento de erros antigamente<a href=\"#Tratamento-de-erros-antigamente\" aria-label=\"Tratamento de erros antigamente permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Em linguagens mais antigas o tratamento de erros tinha que feito de maneira mais manual pois não existia por padrão na linguagem um mecanismo para lidar com essas situações, o que era feito em muitas situações era retornar um booleano que representasse se a chama a algum método foi executada com sucesso ou não, como no exemplo abaixo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">metodo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    \n    <span class=\"token comment\">//Simulando condição que poderia causar um problema no código</span>\n    <span class=\"token keyword\">boolean</span> condicao <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>condicao<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Retorno false para indicar que algo não ocorreu bem</span>\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\">//Retorno true para informar que tudo ocorreu bem</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O problema dessa abordagem é que o retorno de uma chamada a um método pode ser ignorado e então a eficácia fica prejudicada, tirando o fato que retornar um booleano não informa nada a respeito de qual foi o problema que ocorreu, se foi falta de memória, falha na lógica ou qualquer outra situação.</p>\n<p>A segunda abordagem para tentar ser mais informativa era ter um método que retornava um código de erro, geralmente um numérico, e a partir dele buscar qual foi o problema:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">int</span> <span class=\"token function\">metodo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token class-name\">String</span> problema <span class=\"token operator\">=</span> <span class=\"token string\">\"banco_de_dados\"</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>problema<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">case</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"banco_de_dados\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token number\">233</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">case</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"falta_de_memoria\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token number\">567</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">case</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"problema_de_comunicacao_externa\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token number\">421</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n            <span class=\"token comment\">//Problema desconhecido</span>\n            <span class=\"token keyword\">return</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima o método simula um problema de comunicação com o banco de dados e retorna o código 233, o problema do retorno ser ignorado permanece porém mesmo que seja feito uma tratativa do retorno agora será necessário ter um dicionário de erros para fazer a consulta e entender o erro que foi retornado. Para resolver esse problema no <strong>Java</strong> foi criado o mecanismo de <strong>Exceptions</strong>.</p>\n<h2 id=\"O-que-e-uma-Exception\" style=\"position:relative;\">O que é uma Exception<a href=\"#O-que-e-uma-Exception\" aria-label=\"O que e uma Exception permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Quando desenvolvemos aplicações e códigos em linguagens compiladas, como é o caso do <strong>Java</strong>, o compilador força escrevermos linhas de códigos que contenham a sintaxe correta que a linguagem exige, porém o compilador é incapaz de verificar a lógica que está sendo aplicada, por exemplo se executarmos um programa e em algum ponto tentarmos acessar uma variável que seja nula a execução do programa será interrompida e será exibida uma mensagem que irá conter a seguinte informação: <strong>java.lang.NullPointerException</strong> ou se tentarmos executar um programa que tenha um loop infinito porém com uma sintaxe correta o compilador não irá avisar e ao executar o programa em algum momento o programa irá ser interrompido e será exibida uma mensagem que contenha o seguinte: <strong>java.lang.StackOverflowError</strong>.</p>\n<p>A primeira mensagem diz respeito a uma <strong>Exception</strong> e a segunda diz respeito a um <strong>Error</strong>, é importante entender essa diferença da linguagem. </p>\n<p>Uma <strong>Exception</strong> é uma situação anormal dentro do seu programa, causada por alguma falha de lógica, ou seja por alguma falha no processo de construção do programa, onde por mais que a sintaxe esteja certa o problema ocorre pela forma como o programa será executado, como no exemplo de um <strong>NullPointerException</strong> onde a sintaxe está correta porém a lógica não está; para ficar claro vamos ver o código abaixo utilizando a mesma aplicação bancária que estamos desenvolvendo ao longo desses artigos:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Conta</span> guilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nguilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>guilherme<span class=\"token punctuation\">.</span><span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O código acima irá compilar sem problema porém ao executar será lançada a <strong>Exception</strong> pois tentamos executar um método de uma variável que é nula.</p>\n<p>Um <strong>Error</strong> no <strong>Java</strong> é um problema que ocorre em partes onde nós como desenvolvedores de software não deveríamos ter acesso, como por exemplo a <strong>JVM</strong> ou o gerenciamento de memória, são problemas que ocorreram ou por uma falha interna da linguagem e sendo o caso deve ser corrigido em alguma versão futura ou então são problemas que ocorrem pois alguma lógica causou um problema interno, como no exemplo de um loop infinito, resumindo são problemas que nós como desenvolvedores não iremos atuar a não ser no segundo caso onde podemos corrigir a lógica.</p>\n<p>Para ficar mais claro essa distinção entre <strong>Exception</strong> e <strong>Error</strong> segue o diagrama de hierarquia de classes:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 526px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.190184049079754%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAdeKCLRRb//EABoQAAICAwAAAAAAAAAAAAAAAAABAhEDEjH/2gAIAQEAAQUCs4bClYpWlkP/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFX/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BiP/EABkQAQACAwAAAAAAAAAAAAAAAAABMSFxkf/aAAgBAQAGPwJhU8TbSn//xAAcEAACAgIDAAAAAAAAAAAAAAABEQAxIVFxgdH/2gAIAQEAAT8hJmgVxHQD2DEgZoQeDGVhNzB6n//aAAwDAQACAAMAAAAQTw//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxCj/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFR/9oACAECAQE/EKXj/8QAHBAAAgICAwAAAAAAAAAAAAAAAREAITFBUXHh/9oACAEBAAE/EDCAOiCbliQNFiD0UfMolMa9xWfcLSy5Yz//2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"hierarquia de exceções\"\n        title=\"hierarquia de exceções\"\n        data-src=\"/static/bbe438f387796ff0e8c351967fc22197/7883f/hierarquia-throwable.jpg\"\n        data-srcset=\"/static/bbe438f387796ff0e8c351967fc22197/d2f63/hierarquia-throwable.jpg 163w,\n/static/bbe438f387796ff0e8c351967fc22197/c989d/hierarquia-throwable.jpg 325w,\n/static/bbe438f387796ff0e8c351967fc22197/7883f/hierarquia-throwable.jpg 526w\"\n        sizes=\"(max-width: 526px) 100vw, 526px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p><strong>Throwable</strong> é a mãe tanto de <strong>Exceptions</strong> quanto de <strong>Errors</strong>, podemos ver no diagrama acima que tanto a classe <strong>Exception</strong> quanto <strong>Error</strong> possuem subclasses, isso ocorre através da <strong>Herança</strong> onde para cada problema existe uma especialização para tratá-lo, essa é uma boa prática pois fica mais claro para a pessoa que ira corrigir o problema conseguir o máximo de detalhes do problema, por essa razão é considerado uma má prática trabalhar diretamente com <strong>Throwable</strong> pois além de ser uma classe genérica ela também lida com as sub-classes de <strong>Error</strong> e como dissemos anteriormente os problemas que lançam <strong>Error</strong> no <strong>Java</strong> são situações irrecuperáveis que os desenvolvedores não devem lidar no dia-a-dia.</p>\n<p>Fora isso existe um outro ponto quando falamos de <strong>Exceptions</strong> que podemos ver no diagrama que é a sub-classe <strong>RuntimeException</strong>, é importante saber que essa classe tem um comportamento diferenciado das outras <strong>Exceptions</strong>, que iremos entender mais abaixo, que é a capacidade de ser uma exceção que pode ser ignorada e não tratada pois se trata de uma <strong>Unchecked Exception</strong> e iremos entender a diferença entre <strong>Checked</strong> e <strong>Unchecked Exceptions</strong>.</p>\n<h2 id=\"Lancando-Exceptions\" style=\"position:relative;\">Lançando Exceptions<a href=\"#Lancando-Exceptions\" aria-label=\"Lancando Exceptions permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Antes de entender <strong>Checked</strong> e <strong>Unchecked Exceptions</strong> vamos ver primeiramente como lançar exceções; voltando para a aplicação bancária imagine o que iria acontecer se alguém tentar sacar um valor maior do que tem no saldo, imaginando que não existe nada referente a limites adicionais para essa conta, esse comportamento é algo que é anormal para a regra de negócio desse programa e queremos que a execução dele pare e o usuário que tentou fazer essa operação seja notificado.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">.</span><span class=\"token function\">compareTo</span><span class=\"token punctuation\">(</span>saldo<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Valor do saque é maior do que o saldo</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Você não pode sacar esse valor\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método <strong>compareTo</strong> da classe <strong>BigDecimal</strong> compara valores e retorna 0 caso sejam iguais, 1 se for o valor <strong>quantidade</strong>, nesse caso, for menor do que o <strong>saldo</strong> e -1 se o valor da <strong>quantidade</strong> for maior do que o <strong>saldo</strong>, se executarmos passando um valor maior que o saldo uma mensagem será exibida, porém o código prosseguirá e será sacado o valor deixando o saldo negativo, com o mecanismo de <strong>Exceptions</strong> podemos interromper o método e devolver uma mensagem informativa de que algo não ocorreu bem.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">.</span><span class=\"token function\">compareTo</span><span class=\"token punctuation\">(</span>saldo<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Valor do saque é maior do que o saldo</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor do saque é maior do que o seu saldo\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora o código foi alterado e estamos criando um objeto <strong>Exception</strong> passando a mensagem no seu construtor, só criar um objeto com <strong>new</strong> não é o suficiente para que a <strong>Exception</strong> seja disparada, ou lançada como é o termo usado para esses casos, para isso o <strong>Java</strong> conta com a palavra <strong>throw</strong>, lançar em inglês, que fará com que a <strong>Exception</strong> seja lançada fazendo com que o código seja interrompido.</p>\n<p>Se voc6e tentou fazer esse exemplo deve ter percebido que o código não compilou, isso acontece pois quando escrevemos uma clausula <strong>throw</strong> é necessário indicar ou marcar o método como sendo um método que “perigoso” que pode vir a lançar uma <strong>Exception</strong>; para isso é necessário adicionar após a declaração dos parâmetros a palavras <strong>throws</strong> seguido da <strong>Exception</strong> que pode ser lançada pelo método:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">.</span><span class=\"token function\">compareTo</span><span class=\"token punctuation\">(</span>saldo<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Valor do saque é maior do que o saldo</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor do saque é maior do que o seu saldo\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Porém esse método ainda não vai compilar nessa aplicação e isso tem a ver com com o fato do método <strong>saca</strong> ser herdado da classe abstrata <strong>Conta</strong> e nesse caso teremos que adicionar essa mesma declaração na classe <strong>Conta</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"EXECUTA REGRA DE NEGÓCIO GENERALISTA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E ainda falta um último ajuste que é adicionar essa clausula no próprio método <strong>main</strong>, agora o método compila e se executarmos da seguinte forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Conta</span> guilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    guilherme<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A saída será a seguinte:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE\nSAQUE PARA PESSOA Guilherme COM DOCUMENTO CPF\nException <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> java.lang.Exception: Você não pode sacar esse valor\n\tat br.com.company.artigox.PessoaFisica.saca<span class=\"token punctuation\">(</span>PessoaFisica.java:22<span class=\"token punctuation\">)</span>\n\tat br.com.company.artigox.Main.main<span class=\"token punctuation\">(</span>Main.java:11<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Na saída do console fica explícito que houve uma <strong>Exception</strong> informando em qual thread ocorreu, qual o tipo dessa <strong>Exception</strong>, a mensagem customizada e se continuarmos lendo a pilha de log é informado qual foi o método que ocorreu a <strong>Exception</strong> e como ele foi subindo a pilha de execução até chegar no método <strong>main</strong> e não havendo nenhuma tratativa o programa encerrou.</p>\n<p>Para entender essa pilha de execução e por que foi necessário colocar a clausula <strong>throws Exception</strong> no método <strong>main</strong> vamos ver adiante como tratar <strong>Exceptions</strong>.</p>\n<h2 id=\"Tratando-Exceptions\" style=\"position:relative;\">Tratando Exceptions<a href=\"#Tratando-Exceptions\" aria-label=\"Tratando Exceptions permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Você já viu como lançar uma <strong>Exception</strong> porém não queremos que toda exceção pare a execução do programa, as vezes queremos contornar o problema e para isso podemos fazer uso de blocos <strong>try-catch</strong>, para isso vamos adicionar uma nova funcionalidade na Conta, que é a capacidade de realizar transferências e para essa funcionalidade iremos reaproveitar os métodos <strong>saca</strong> e <strong>deposita</strong>, onde iremos ter a conta que irá fazer a transferência, a conta que irá receber e a quantidade da transferência, porém o método <strong>saca</strong> pode lançar uma <strong>Exception</strong> caso o valor do saldo não seja suficiente e queremos que para esse caso se o valor não for suficiente será liberado um crédito para essa transação, vamos ver agora como fazer isso:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">transfere</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> de<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Conta</span> para<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        valor <span class=\"token operator\">=</span> de<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor da transferência %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Libera limite especial para transferencias</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Executando código para se recuperar da Exception\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        valor <span class=\"token operator\">=</span> quantidade<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    para<span class=\"token punctuation\">.</span><span class=\"token function\">deposita</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui estamos usando o bloco <strong>try-catch</strong> para fazer o tratamento de um <strong>Exception</strong>, explicando por partes temos primeiramente o bloco <strong>try</strong> esse bloco irá lidar com métodos ou trechos de códigos que podem lançar uma <strong>Exception</strong> e como o nome dele diz try ou tente em tradução direta, irá tentar executar o método <strong>saca</strong> porém sabendo que pode haver algum imprevisto, se ocorrer uma <strong>Exception</strong> o bloco <strong>try</strong> para e “pula” para o bloco <strong>catch</strong> que antes de ser executado irá fazer a comparação do tipo da <strong>Exception</strong> lançada com o tipo da <strong>Exception</strong> que o bloco catch trata se corresponderem o bloco será executado e se no bloco try não ocorrer nenhuma <strong>Exception</strong> o bloco é finalizado porém o bloco catch nunca será executado e o método continua. Uma ultima coisa que podemos ver é que quando tratamos o erro com um bloco <strong>try-catch</strong> não é necessário fazer a declaração <strong>throws</strong> no método, ela só se faz necessária quando não tratamos o possível lançamento da exceção pois nesse caso quem deverá tratar é quem chama o método que pode lançar a <strong>Exception</strong> e se este não tratar deve declarar <strong>throws</strong> para que o próximo faça o tratamento, e isso vai subindo na pilha de execução dos métodos até chegar no método <strong>main</strong> que é o método principal de execução de uma aplicação <strong>Java</strong> se a <strong>Exception</strong> não for tratada lá e ocorrer uma <strong>Exception</strong> o programa vai exibir no console a mensagem da <strong>Exception</strong> juntamente com o log da pilha de execução e vai terminar.</p>\n<p>Agora executando esse código para que seja lançada uma <strong>Exception</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Conta</span> guilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Conta</span> destino <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Conta de Destino\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    guilherme<span class=\"token punctuation\">.</span><span class=\"token function\">transfere</span><span class=\"token punctuation\">(</span>guilherme<span class=\"token punctuation\">,</span> destino<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Perceba que tiramos a declaração <strong>throws Exception</strong> pois o método <strong>transfere</strong> já faz a tratativa e quando o código é executado a saída contém:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Executando código para se recuperar da Exception</code></pre></div>\n<p>Não foi executado o print de console que existe após a chamada do método <strong>saca</strong> pois foi lançado uma <strong>Exception</strong> e isso interrompeu o fluxo do bloco <strong>try</strong> que passou para o bloco <strong>catch</strong> que executou e depois prosseguiu o fluxo do método normalmente.</p>\n<p>Foi dito anteriormente que o <strong>catch</strong> faz checagem se o tipo da <strong>Exception</strong> lançada é do mesmo tipo que está no bloco <strong>catch</strong> e isso acontece para que possamos tratar múltiplas <strong>Exceptions</strong> em um mesmo bloco <strong>try-catch</strong>, mas para ver isso vamos aprender primeiro como criar as nossas próprias <strong>Exceptions</strong>.</p>\n<h2 id=\"Criando-Exceptions-customizadas\" style=\"position:relative;\">Criando Exceptions customizadas<a href=\"#Criando-Exceptions-customizadas\" aria-label=\"Criando Exceptions customizadas permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui vamos aprender a criar nossas próprias <strong>Exceptions</strong>, tratar multiplas <strong>Exceptions</strong> e entender a diferença entre <strong>Checked</strong> e <strong>Unchecked Exceptions</strong>.</p>\n<p>Primeiramente por que é necessário criar <strong>Exceptions</strong> customizadas já que existem muitas <strong>Exceptions</strong> prontas no <strong>Java</strong>?</p>\n<p>Pra responder essa pergunta devemos olhar para a nossa aplicação e entender que tipo de problemas podemos ter no método <strong>saca</strong>, o método <strong>saca</strong> pode ter o problema de não haver saldo suficiente porém quando ocorre um problema desse nós tratamos como se fosse uma <strong>Exception</strong>, uma generalização que não explica muito bem o que ocorreu se não fosse a mensagem que passamos, se olharmos as outras classes de <strong>Exceptions</strong> vamos entender que elas lidam com aspectos de programação voltados a utilização de recursos como leitura/escrita de arquivos, carregamento de classes na memória, comunicação com serviços externos mas nenhuma delas foi feita para lidar com regras de negócios de projetos, isso foi pensado para que cada projeto pudesse ter a flexibilidade de criar as suas próprias <strong>Exceptions</strong>. Então dado o nosso cenário podemos criar uma <strong>Exception</strong> como <strong>SaldoInsuficienteException</strong> e para fazer isso usaremos <strong>Herança</strong> para criar essa <strong>Exception</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SaldoInsuficienteException</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">{</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">SaldoInsuficienteException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Fazendo isso já temos a classe de <strong>Exception</strong> criada, perceba que herdamos da classe <strong>Exception</strong> e usamos um construtor para invocar a classe-mãe passando a mensagem de erro e podemos substituir em nosso código:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">SaldoInsuficienteException</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">.</span><span class=\"token function\">compareTo</span><span class=\"token punctuation\">(</span>saldo<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Valor do saque é maior do que o saldo</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SaldoInsuficienteException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Você não pode sacar esse valor\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E se executarmos o código com um valor maior que o saldo:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Exception <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> br.com.company.artigox.SaldoInsuficienteException: Você não pode sacar esse valor\n\tat br.com.company.artigox.PessoaFisica.saca<span class=\"token punctuation\">(</span>PessoaFisica.java:22<span class=\"token punctuation\">)</span>\n\tat br.com.company.artigox.Main.main<span class=\"token punctuation\">(</span>Main.java:15<span class=\"token punctuation\">)</span></code></pre></div>\n<p>A mensagem do erro é mais indicativa ao desenvolvedor que ler esse log pois além da mensagem que foi passada o próprio nome da <strong>Exception</strong> é indicativo.</p>\n<p>Agora temos uma <strong>Exception</strong> customizada e específica criada e com isso podemos fazer o tratamento de múltiplas exceções com um bloco <strong>try-multi-catch</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">transfere</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> de<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Conta</span> para<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        valor <span class=\"token operator\">=</span> de<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor da transferência %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">SaldoInsuficienteException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Libera limite especial para transferencias</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Executando código para se recuperar da Exception\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        valor <span class=\"token operator\">=</span> quantidade<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//Erro não previsto</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BusinessException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Problema inesperado no método transfere\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    para<span class=\"token punctuation\">.</span><span class=\"token function\">deposita</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Entendendo o código acima, no bloco <strong>try</strong> tentamos executar o método <strong>saca</strong> e se houver alguma exceção do tipo <strong>SaldoInsuficienteException</strong> será executado o bloco <strong>catch</strong> correspondente ou se qualquer outra exceção ocorrer, pelo fato de todas as exceções serem sub-classes de <strong>Exception</strong>, será re-lançada como uma <strong>BusinessException</strong>, que tem o mesmo padrão da <strong>SaldoInsuficienteException</strong>, com uma mensagem mais amistosa.</p>\n<p>*<em>Obs: Essa é uma técnica para que a exceção seja manipulada mas continue sendo lançada, provavelmente para adicionar logs importantes ou até mesmo mudar o tipo da exceção lançada.</em></p>\n<p>Além dessa forma também existe uma outra forma de tratar exceções para que o código não fique verboso, que é o aninhamento de exceções em um bloco <strong>catch</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    valor <span class=\"token operator\">=</span> de<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor da transferência %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">SaldoInsuficienteException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">BusinessException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//Libera limite especial para transferencias</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Executando código para se recuperar da Exception\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    valor <span class=\"token operator\">=</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nesse caso se ocorrer uma exceção do tipo <strong>SaldoInsuficienteException</strong> ou <strong>BusinessException</strong> o tratamento será o mesmo, isso poupa linhas de código e deixa o código mais semântico mas pode ser perigoso pois será a mesma trativa para as exceções declaradas e as vezes não é isso o que queremos.</p>\n<p>Porém agora podemos nos perguntar sobre o seguinte, cada método que chamar o método saca tem duas possibilidades ou trata uma possível <strong>Exception</strong> ou delega para o próximo método, não existe alternativas quando trabalhamos com classes que herdam de <strong>Exception</strong>, porém existem situações em que o melhor não seria que o programa se recuperasse, talvez fosse melhor ele “quebrar” mas que contenha informações relevantes sobre o motivo se sua interrupção. E para isso existe o conceito de <strong>Checked</strong> e <strong>Unchecked Exceptions</strong>.</p>\n<p>Começando pelas <strong>Checked Exceptions</strong>, são as que nós estamos trabalhando desde o início do artigo, são todas as que são sub-classes de <strong>Exception</strong>, esse tipo de exceção obriga o desenvolvedor a tratar a <strong>Exception</strong> ou lançar para a próxima chamada a responsabilidade, como vimos nos exemplos anteriores. A ideia por detrás dela é que são situações que o desenvolvedor pode contornar em fluxo lógico, como foi o exemplo do método <strong>transfere</strong> que era um situação onde mesmo estourando uma <strong>Exception</strong> havia um desvio lógico possibilitando que o código prosseguisse.</p>\n<p>As <strong>Unchecked Exceptions</strong> são o oposto, são situações onde não queremos que uma atitude seja tomada, se por acaso ocorrer um problema estamos satisfeitos com o fato do programa encerrar mas queremos ter o máximo de informações possíveis para entender o que ocorreu; por essa razão são exceções que não precisam de um <strong>try-catch</strong> e nem somos obrigados a tratar ou delegar para a próxima chamada tratar. Pensando nisso vamos alterar a classe <strong>SaldoInsuficienteException</strong> pois se pensarmos bem se o saldo for insuficiente não queremos tratar isso no método <strong>saca</strong>, queremos que o fluxo seja interrompido e que seja impresso no log o máximo de informações possíveis a respeito do que ocasionou essa falha. </p>\n<p>Mas o que precisamos alterar para tornar uma <strong>Checked Exception</strong> em <strong>Unchecked Exception</strong>?</p>\n<p>Olhando novamente o diagrama de classes das <strong>Exceptions</strong> podemos encontrar:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 526px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.190184049079754%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAdeKCLRRb//EABoQAAICAwAAAAAAAAAAAAAAAAABAhEDEjH/2gAIAQEAAQUCs4bClYpWlkP/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFX/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BiP/EABkQAQACAwAAAAAAAAAAAAAAAAABMSFxkf/aAAgBAQAGPwJhU8TbSn//xAAcEAACAgIDAAAAAAAAAAAAAAABEQAxIVFxgdH/2gAIAQEAAT8hJmgVxHQD2DEgZoQeDGVhNzB6n//aAAwDAQACAAMAAAAQTw//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxCj/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFR/9oACAECAQE/EKXj/8QAHBAAAgICAwAAAAAAAAAAAAAAAREAITFBUXHh/9oACAEBAAE/EDCAOiCbliQNFiD0UfMolMa9xWfcLSy5Yz//2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"hierarquia de exceções\"\n        title=\"hierarquia de exceções\"\n        data-src=\"/static/bbe438f387796ff0e8c351967fc22197/7883f/hierarquia-throwable.jpg\"\n        data-srcset=\"/static/bbe438f387796ff0e8c351967fc22197/d2f63/hierarquia-throwable.jpg 163w,\n/static/bbe438f387796ff0e8c351967fc22197/c989d/hierarquia-throwable.jpg 325w,\n/static/bbe438f387796ff0e8c351967fc22197/7883f/hierarquia-throwable.jpg 526w\"\n        sizes=\"(max-width: 526px) 100vw, 526px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Podemos ver na hierarquia que as classes <strong>NullPointerException</strong>, <strong>ArrayIndexOutOfBounds</strong>, <strong>ArithmeticException</strong> entre outras são sub-classes de <strong>RuntimeException</strong>, ora quando um erro do tipo <strong>NullPointerException</strong> é lançado não devemos realizar uma tratativa do tipo <strong>try-catch</strong> para recuperar a aplicação, nós geralmente olhamos o código e encontramos onde está uma referência nula e arrumamos e nem o compilador reclama quando fazemos uma conta dividindo por 0 que causará uma <strong>ArithmeticException</strong>, só somos avisado da falha no momento de execução do programa ou em <strong>Runtime</strong> e é por isso que erros do tipo <strong>RuntimeException</strong> não serão verificados pelo compilador para que sejam tratados, logo para transformar uma <strong>Checked Exception</strong> em <strong>Unchecked Exception</strong> basta herdar de <strong>RuntimeException</strong> ao invés de <strong>Exception</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SaldoInsuficienteException</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">RuntimeException</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">SaldoInsuficienteException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Foi somente essa mudança e com isso podemos alterar o método <strong>saca</strong> e retirar a declaração <strong>throws SaldoInsuficienteException</strong> no método e o compilador não irá reclamar mais. E podemos no método <strong>saca</strong> adicionar informações importantes para gerar a mensagem de erro:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">.</span><span class=\"token function\">compareTo</span><span class=\"token punctuation\">(</span>saldo<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SaldoInsuficienteException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Saldo insuficiente em conta: %s - Valor do saque: %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">,</span> quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E se executarmos de uma forma que sabemos que a exceção será lançada:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Conta</span> guilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    guilherme<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Note que não precisamos mais passar a declaração <strong>throws SaldoInsuficienteException</strong> e nenhum ponto do código e a saída no console será:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Exception <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> br.com.company.artigox.SaldoInsuficienteException: Saldo insuficiente em conta: <span class=\"token number\">1000</span> - Valor <span class=\"token keyword\">do</span> saque: <span class=\"token number\">2000</span>\n\tat br.com.company.artigox.PessoaFisica.saca<span class=\"token punctuation\">(</span>PessoaFisica.java:21<span class=\"token punctuation\">)</span>\n\tat br.com.company.artigox.Main.main<span class=\"token punctuation\">(</span>Main.java:15<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"Finally\" style=\"position:relative;\">Finally<a href=\"#Finally\" aria-label=\"Finally permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Como estamos falando sobre blocos <strong>try-catch</strong> faz sentido falarmos sobre o bloco <strong>finally</strong>. Este bloco é opcional dentro do bloco <strong>try-catch</strong> mas muito útil quando queremos que alguma ação tomada independente de uma <strong>Exception</strong> será lançada ou não. </p>\n<p>Para demonstrar o uso do <strong>finally</strong> vamos imaginar um cenário hipotético onde a nossa aplicação fará acesso ao banco de dados e independente de ocorrer nós queremos que a conexão com o banco seja fechada ao fim do método, pois operações de comunicação com outros serviços consomem muito da capacidade computacional, e queremos garantir que mesmo em um cenário de falha a conexão será fechada. Para demonstrar isso vamos ver o código abaixo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">conectaBancoDeDados</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">BusinessException</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Conectando...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SQLException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Problemas na conexão\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">SQLException</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BusinessException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Problema na conexão com o banco de dados: %s - %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">getClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">getMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Fechando conexão com o banco\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A parte do bloco <strong>try-catch</strong> não sofreu alteração a única coisa que foi acrescentada foi o bloco <strong>finally</strong> após o bloco <strong>catch</strong>, e se entendermos o código acima vamos perceber que no bloco <strong>try</strong> é lançada uma exceção do tipo <strong>SQLException</strong> passando a mensagem <em>Problemas na conexão</em> e na sequência o bloco <strong>catch</strong> captura essa exceção e faz manipulação para uma exceção do tipo <strong>BusinessException</strong>, onde encapsulamos a exceção original mas conseguimos extrair algumas informações importantes da exceção original pois o bloco <strong>catch</strong> recebe uma variável com a instância da <strong>SQLException</strong> e conseguimos pegar alguns dados como o nome da classe, a mensagem original entre outras coisas. E por fim o bloco <strong>finally</strong> executa e irá exibir a mensagem no console <em>Fechando conexão com o banco</em> mesmo que no bloco <strong>catch</strong> tenha sido lançado um exceção, se rodarmos essa código teremos a seguinte saída:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Conectando<span class=\"token punctuation\">..</span>.\nFechando conexão com o banco\nException <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> br.com.company.artigox.BusinessException: Problema na conexão com o banco de dados: java.sql.SQLException - Problemas na conexão\n\tat br.com.company.artigox.Main.conectaBancoDeDados<span class=\"token punctuation\">(</span>Main.java:20<span class=\"token punctuation\">)</span>\n\tat br.com.company.artigox.Main.main<span class=\"token punctuation\">(</span>Main.java:10<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Então entendemos com isso que se houver ou não um lançamento de exceção o bloco <strong>finally</strong> sempre será executado e isso é muito útil em cenários onde queremos ter a garantia de uma ação independente de qualquer falha que possa ocorrer. E isso é tão útil que podemos ter até mesmo blocos <strong>try-finally</strong> sem que aja um <strong>catch</strong> pois até mesmo tomando o exemplo do código acima, nós não chegamos a fazer uma tratativa de erro, só envelopamos e uma exceção customizada e lançamos pra cima, então nesse caso podemos fazer da seguinte maneira, se não quisermos tratar a exceção mas garantir o fechamento da conexão com o banco:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">conectaBancoDeDados</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">SQLException</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Conectando...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SQLException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Problemas na conexão\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Fechando conexão com o banco\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse é bloco válido e se executarmos o resultado será:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Conectando<span class=\"token punctuation\">..</span>.\nFechando conexão com o banco\nException <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> java.sql.SQLException: Problemas na conexão\n\tat br.com.company.artigox.Main.conectaBancoDeDados<span class=\"token punctuation\">(</span>Main.java:17<span class=\"token punctuation\">)</span>\n\tat br.com.company.artigox.Main.main<span class=\"token punctuation\">(</span>Main.java:10<span class=\"token punctuation\">)</span></code></pre></div>\n<p>O que mudou foi a exceção que foi exibida e esse tipo de abordagem vai depender e variar muito de acordo com o tipo de exceção e de regra para tratamento de exceções que você como pessoa desenvolvedora estiver trabalhando.</p>\n<h2 id=\"Try-with-Resources\" style=\"position:relative;\">Try with Resources<a href=\"#Try-with-Resources\" aria-label=\"Try with Resources permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Uma novidade que veio a partir do <strong>Java7</strong> foi a possibilidade de executarmos o <strong>finally</strong> automaticamente, pois não era raro a pessoa que estava desenvolvendo esquecer de adicionar o bloco <strong>finally</strong> e pensando em uma situação de conexão com um banco de dados por exemplo não iria ocorrer um erro logo a princípio mas a cada nova conexão com o banco iria aumentando o número de conexões abertas que não iriam ser fechadas nunca até o ponto que o banco não suportasse mais a quantidade de conexões abertas e o erro iria ocorrer na aplicação, mas nem sempre isso era rápido de ocorrer e quando o erro fosse notado já poderia ser tarde demais e usuários já estariam usando a aplicação e sendo ela quebrando, pensando nisso foi adicionada essa nova funcionalidade.</p>\n<p>Para fazer uso do <strong>try-with-resources</strong> é necessário que a classe que tenha o método que será executado no <strong>try</strong> implemente a <strong>interface AutoCloseable</strong>, para ilustrar isso vamos criar uma classe de conexão ao banco de dados, como no exemplo anterior, e implementar essa <strong>interface</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ConexaBD</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">AutoCloseable</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">conectaBanco</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">SQLException</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Conectando...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SQLException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Erro na conexão\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">SQLException</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Fechando conexão\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A <strong>interface AutoCloseable</strong> nos obriga a implementar o método <strong>close</strong> que será invocado ao fim da execução da classe <strong>ConexaoDB</strong>, o método <strong>close</strong> lança uma <strong>Exception</strong> mas nesse caso foi alterado para <strong>SQLException</strong> já que uma <strong>SQLException</strong> é também uma <strong>Exception</strong> por herança.</p>\n<p>Para usar o <strong>try-with-resources</strong> basta que criemos a instância dentro do bloco <strong>try</strong>, vamos ver no exemplo para esclarecer:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">try</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">ConexaBD</span> conexaBD <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ConexaBD</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    conexaBD<span class=\"token punctuation\">.</span><span class=\"token function\">conectaBanco</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">SQLException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Problema na conexão com o banco de dados: %s - %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">getClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">getMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Perceba que após o <strong>try</strong> abrimos parenteses e criamos um objeto do tipo <strong>ConexaoDB</strong>, lembrando que isso só será possível se a classe implementar a <strong>interface AutoCloseable</strong>, e dentro do bloco utilizamos normalmente o método <strong>conectaBanco</strong>, após isso fazemos o tratamento da possível exceção que pode ser lançada e só, não foi adicionado o bloco <strong>finally</strong>, porém na classe <strong>ConexaoDB</strong> possui o método <strong>close</strong> e ele será invocado ao final do bloco <strong>try-catch</strong> independente de uma exceção ser lançada ou não:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Conectando<span class=\"token punctuation\">..</span>.\nFechando conexão\nProblema na conexão com o banco de dados: java.sql.SQLException - Erro na conexão</code></pre></div>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vimos nesse artigo mas motivações que causaram a criação de <strong>Exceptions</strong> no <strong>Java</strong>, também foi mostrado a hierarquia de classes de exceções. Entendemos como utilizar as <strong>Exceptions</strong> que já existem na linguagem e como criar as nossas exceções customizadas. Como podemos tratá-las através do bloco <strong>try-catch</strong> e como podemos fazer vários blocos <strong>catch</strong> ou então blocos aninhados.</p>\n<p>Por fim entendemos a diferença entre <strong>Checked</strong> e <strong>Unchecked Exceptions</strong> e qual escolher em cada caso, como usar o bloco <strong>try-catch-finally</strong>, <strong>try-finally</strong> e como podemos usar o recurso que foi adicionado no <strong>Java7</strong>, o <strong>try-with-resources</strong> juntamente com a <strong>interface AutoCloseable</strong>.</p>\n<p>O código deste artigo se encontra no <a href=\"https://github.com/guilhermegarcia86/helloworld\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>\n<p>Visite também o nosso canal no <a href=\"https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Youtube</a> para mais acompanhar essa série de <strong>Primeiros passos com o Java</strong> e muito mais conteúdos sobre programação.</p>","fields":{"slug":"/java-iniciante-pt10/"},"frontmatter":{"date":"10 de dezembro de 2021","description":"Trabalhando com Exceptions","title":"Primeiros passos com Java X","tags":["Java","Beginner","Exception"],"author":"Guilherme Alves","image":{"id":"9896600e-0fcf-534a-a2ee-c4a18ec6660a","publicURL":"/static/5a5d4f4c0f750a36a01bf31563d0efe6/java-artigoX.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB1ElEQVQ4y31UXW8aMRD02b7vO7hAi0JExUcE1xaaIlL60CfS9BlF/f//ZbpjzldHoX1Y7dnMzs7sWigdRfARMZSCthZ2eAObpLBZDlOU0FojxIZ4ZiU5iWMofxGCzKCBTjMhjmHqwaUJ74XUXCHWHXGaJFD9pQBdRxYNmwtJWTlCI9//IgoJk0QUvgZq94MVi7RLhXb8HobfkepxTmn0ukFvObSqOvvWGNi8cIW2HsJWNXSgMrpi/w0hgxdUqP4TxMWytPD8hpCHwWCAm6bBcrHAbrvF9PYWi/kc289b3E2n+DCbYS7n1WqFrw8P2KzXmEwm/cL+brmzoDsLawGeTidXcDgc8Ov5GV92O3x7fMR+v8fxeMTPpyd8l/zpY+uITOfMbTkK5pfIRVkUjjyX90dAkedO3bvx+OoI4nYH3Yz6+p7Qzy5LUxRCyuzDN/SL8Muo6hr18QequxlieQXWP2wPZmEtoNFo5ObJoDJmI5uPgkUw3y+X+P3ygk3bOmfEKD6RRgpyseaV8I52U1HHjYYzjkWFtRfydrPB+Xx2S3T2qZDF3DCVVVXlgt2KLvhdlmV3zi/jyLJepVMsjXrCcMCUTFVUW3qygJxEVG47++Efgyf8AwLWMxC13qcuAAAAAElFTkSuQmCC","aspectRatio":1.4096916299559472,"src":"/static/5a5d4f4c0f750a36a01bf31563d0efe6/0823f/java-artigoX.png","srcSet":"/static/5a5d4f4c0f750a36a01bf31563d0efe6/c67b7/java-artigoX.png 320w,\n/static/5a5d4f4c0f750a36a01bf31563d0efe6/d3930/java-artigoX.png 640w,\n/static/5a5d4f4c0f750a36a01bf31563d0efe6/0823f/java-artigoX.png 1280w,\n/static/5a5d4f4c0f750a36a01bf31563d0efe6/17523/java-artigoX.png 1747w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":21}},"pageContext":{"slug":"/java-iniciante-pt10/","previous":{"fields":{"slug":"/java-iniciante-p9/"},"frontmatter":{"title":"Primeiros passos com Java IX","date":"30 nov, 2021"}},"next":{"fields":{"slug":"/git-no-dia-a-dia/"},"frontmatter":{"title":"Git para o seu dia a dia","date":"21 mar, 2022"}}}},"staticQueryHashes":["63159454"]}