[MÚSICA] [MÚSICA] Olá a todos, bem vindos a mais hands-on do curso de Orientação a Objetos com Java, eu sou o Eduardo Guerra e hoje a gente vai exercitar pouco essa parte de excepções, não é? Eu sei que às vezes mostrando o código no slide fica tudo às vezes pouco meio abstrato, não é? Então vamos ver aqui na prática o funcionamento das excepções, a propagação, a questão dos, as [INAUDIBLE], o Try Catch, o Throws, então vamos exercitar tudo isso daqui num exemplo, está? Então eu vou criar aqui novo projeto, não é, eu vou chamar aqui de Excepções, certo? E eu vou criar uma classe principal que chama OutrosMétodos que aí a gente vai ver a questão da propagação das excepções entre eles. Aí então eu vou criar aqui uma classe principal opa, principal, vou marcar aqui para que ela tenha método main, certo? Essa classe aqui, eu vou criar aqui outros métodos, vou criar estático mesmo, não é? Para então vou criar aqui método chamado a, certo, vou passar aqui inteiro aqui para, como parâmetro e vou criar método static void b também recebendo inteiro, certo? Então o que é que vai acontecer? O método main ele vai chamar o método a, certo, eu vou colocar aqui por exemplo passando 100, não é, o metodo a ele vai chamar o método b passando 100 e o método b vai imprimir isso aqui eu vou colocar aqui "executando b com" e aí o número, não é? Vou fazer o mesmo aqui no a aqui. Então ele executando o a com ui, certo? Então vou salvar isso daqui, vou rodar, por enquanto esse código não tem para gente nenhuma novidade, certo? Ele vai chamar ali "Executando a com 100", "Executando b com 100", está? Agora aqui no b o que é que eu vou fazer? Eu vou dar, eu vou dar throw new Exception, está? Aí e aí eu vou colocar uma mensagem: a minha mensagem vai ser "mensagem", opa, faltou aqui r, certo? Bom, ele não aceita, porque é que ele não aceita? O que ele diz que o método ele precisa, não é, tratar essa exceção, está? Então eu posso vir aqui e dar throws exception. Só que aí o erro vai ser no a que invoca o b, ele fala assim "Opa esse cara ele não joga uma exceção também", então eu posso vir aqui e adicionar o throws certo? E aí o mesmo erro vai dar aqui no main e eu vou fazer a mesma coisa, está? Muito bom, está? Bom, quando eu rodar agora ele vai executar o a, o b certo? E ele vai dar essa exceção. Note aqui o stack trace da exceção, eu vou até puxar aqui para o meio para vocês verem, está? Note aqui ele deu o tipo da exceção, a mensagem, aí ele fala assim "Olha essa exceção ela apareceu b. Se eu clicar aqui ele já vai para a linha de código onde aconteceu, não é? Passou por a, que linha ele passou no a? Nessa chamada aqui foi para o main, não é? Então essa sequência aqui é o stack trace da exceção, não é? Ele estava dentro do método main, dentro do método a e dentro do método b, está? Bom, vou mostrar agora como que ficaria para fazer o try catch, está? Então vou encolher de volta aqui o console está? Então ao invés de jogar essa exceção aqui para a frente, não é, eu vou tratar. Então o Eclipse me ajuda aqui também ele dá a opção Surround with try/catch, está? Então eu aqui eu posso dar o print track trace mas ao invés de fazer isso eu vou imprimir aqui "tratando a exceção". Aí eu vou botar dois pontos e aí eu vou colocar aqui e.getMessage, não é, é a mensagem ali do erro, está? Nesse caso, não é, aqui por exemplo eu nem precisaria do throws, está? Então eu salvo e aí por exemplo, quando eu rodar ele vai vir executar "tratando a exceção". A exceção ela não significa que tem que ser " deu erro no programa, deu pau", não, a exceção é erro, está, é erro que pode ser normal, então quem recebe esse erro pode tratar e continuar a execução, como é o caso que acontece aqui está? Por exemplo, se eu imprimir aqui por exemplo "terminando execução de a" não é? Tirar esse finalzinho aqui, não é? E por exemplo "terminando a execução de main", certo? Se eu rodar isso daqui depois que ele tratou o erro ali da mensagem, ele termina a execução do a e depois volta para o main normalmente. Ele só vai dar aquele problema de interromper a execução, não é, se a exceção não for tratada, não é? Note, por exemplo depois que eu jogo a exceção eu acho que ele nem deixa eu, eu adicionar alguma coisa aqui ele diz que aquele código ele não pode, nunca será atingido, está a ver "Unreachable code", está? O que eu posso fazer é de repente colocar condicional aqui por exemplo se i for maior do que 0, então ele joga a exceção por exemplo, está? Aí ele aceita, não é? Mas note que se ele executar a exceção, se ele chegar na exceção ele não continua a execução dessa, dessa instrução aqui, está? Olha lá a gente rodou aqui viu que ele não, não não fez aquilo, está? E aí aqui eu vou passar aqui então, por exemplo, -100 para ele não dar exceção ali baixo, está, ele executa normalmente. Opa, o b está passando 100 não, ficou meio esquisito isso. Então salvo aqui, agora roda de novo, olha lá então ele executa o a, ele executa o b e aí no b ele não vai dar a exceção porque ele não é maior que 0, aí ele termina a execução de b, ele não vai passar pelo catch, ele termina a execução de a, não é, ou seja, depois do try ele continua baixo não é, e aqui vai executar o main, está? Espero que mostrando aí as várias possibilidades, mostrando que dá erro se você não coloca o throws ou não coloca o try catch, espero que tenha ficado mais claro aí o funcionamento aí dessa parte de exceções. Muito obrigado. Até ao próximo hands-on. [MÚSICA]