‫Bem-vindo de volta a este vídeo, vamos finalmente consertar os problemas que tivemos em
‫nosso programa aqui, nosso programa virtual que criamos, e também vamos olhar para a programação defensiva.
‫Então a ideia da programação defensiva é fazer um código seguro que realmente já pense nos problemas que podem surgir, pois neste
‫caso, o problema que pode surgir é que, por exemplo, a lista
‫está vazia ou queremos ter muitos amigos.
‫Então, queremos convidar mais amigos do que temos.
‫E, neste caso, a lista é super simples que criamos manualmente.
‫Mas imagine que é de um banco de dados.
‫Então vem de um banco de dados ou vem da web, de um banco de dados em nuvem ou algo parecido.
‫E então seria uma história diferente porque nunca saberíamos o quão grande é a lista neste caso.
‫Podemos ver isso no código, mas podemos não saber, dependendo de onde vem.
‫Neste caso, temos que antecipar diferentes problemas que podem surgir e podemos testá-los durante
‫o desenvolvimento.
‫Por exemplo, já fizemos isso certo?
‫Inserimos mais amigos que temos na lista.
‫Portanto, é simples.
‫Apenas executamos isso e obtemos esse argumento fora da exceção do intervalo.
‫Mas é interessante saber onde estamos conseguindo.
‫Portanto, estamos obtendo isso no ponto de nosso método do amigo de festa, embora o problema esteja em
‫outro lugar, porque se olharmos para ele, diz Shorris lista de nomes zero.
‫Então, estamos tentando acessar um elemento ilícito que não está disponível porque já passamos da lista.
‫Pegue um amigo de festa e nós passamos essa lista por aqui.
‫Então, se olharmos de onde tiramos essa lista, isso pode ser um bom ponto de partida, porque podemos ver aqui que
‫estamos tentando acessar algo que não está disponível.
‫Então, qual é o problema com o que é disponibilizado?
‫Portanto, podemos olhar para esta linha aqui, obter parte da frente.
‫É aí que é chamado.
‫E podemos ver.
‫Certo, esse é o buffer.
‫Direito?
‫Então temos um buffer, que é esta lista aqui.
‫Portanto, o que estamos obtendo é uma lista do nível superior.
‫Então, novamente, podemos ver, tudo bem, temos essa lista de fulano de tal, de tantas pessoas e é
‫daí que obtemos o valor.
‫E bem, um bom ponto para verificar se a lista é boa é, na verdade, usar um método de get party friends, porque aqui
‫nós acertamos a lista.
‫Portanto, neste ponto, temos uma lista para que possamos verificar esta lista.
‫Podemos ver se essa lista é boa o suficiente para o que queremos fazer.
‫E o que queremos fazer é escrever algo baseado na conta dos elementos dessa
‫lista para que possamos verificar se a contagem é maior do que a contagem de pontos da lista.
‫E esta é a lista que nos foi passada.
‫Então, se for esse o caso, o que podemos fazer é apenas imprimir algo, não fazer isso ou errar ou algo
‫assim.
‫Mas uma coisa ainda melhor que podemos fazer é criar o programa Kresh.
‫Portanto, sabemos que o programa tem um problema.
‫Mas, ao mesmo tempo, paramos a execução do programa em um estágio bem inicial porque imagine que temos uma conexão com um banco de
‫dados e agora estamos criando todos esses erros diferentes ou estamos apenas examinando o código e este método é amigo
‫da festa está rodando e digamos que está conectado a um banco de dados e escreve
‫algo no banco de dados e então rodamos o código novamente.
‫E por alguma razão, o estado do banco de dados mudou e agora estamos maravilhados, porque os dados que são exibidos para
‫nós são completamente sem sentido e nós meio que trabalhamos com eles.
‫Então, consertar esse bug seria um problema real.
‫Tudo bem.
‫Portanto, já podemos capturá-lo o mais cedo possível para que possamos simplesmente lançar um argumento fora do intervalo de exceção aqui.
‫Portanto, lance novos argumentos fora da exceção do intervalo, porque é isso que estávamos acertando.
‫E um argumento fora da exceção Reagan tem sobrecarga múltipla.
‫Portanto, podemos ter este aqui com um nome Parum.
‫Podemos ter uma mensagem e com exceção ou um nome Perram com uma mensagem.
‫Então, aqui eu poderia apenas dizer algo como, OK, a contagem é o problema e a contagem não pode ser maior do
‫que os elementos da lista ou algo parecido.
‫OK, isso seria um exemplo do que poderíamos exibir.
‫Então, vamos executá-lo novamente, porque agora devemos ser capazes de realmente detectar esse erro ou pelo menos lançar um argumento fora do intervalo
‫de exceção assim que obtivermos esse erro.
‫Tudo bem.
‫Portanto, podemos ver algo excepcional não tratado.
‫É um argumento de sistema fora do alcance.
‫A exceção não pode ser maior que os elementos da lista.
‫Contagem de parâmetros.
‫Então esse é o resultado do que escrevemos aqui.
‫OK, então é assim que a exceção será exibida.
‫Portanto, agora sabemos qual é o problema.
‫É um pouco mais expressivo um pouco antes de o problema não estar realmente aqui.
‫Então, deixe-me comentar essas duas linhas.
‫O problema não foi lançado neste ponto, mas foi jogado ainda mais para baixo.
‫Ele foi colocado em nosso método get different, então está na linha 42, mas o problema real surgiu muito
‫antes, certo.
‫E o índice foi a exceção, mas também é uma instrução muito genérica, certo?
‫Pode ser qualquer coisa.
‫Direito.
‫Portanto, perceber isso antes nos ajuda a ver onde estão os problemas que temos.
‫Então, o que poderíamos fazer, é claro, poderíamos dizer, OK, uma vez que inserimos este valor e
‫digamos que este valor venha de um usuário que insira um valor.
‫Direito.
‫Portanto, você pode inserir qualquer valor de zero à quantidade de elementos de lista que temos.
‫Portanto, poderíamos pegá-lo ainda mais cedo.
‫Poderíamos fazer um teste até aqui.
‫Então se.
‫Amigos, essa conta é.
‫Menos do que o valor que a gente entra aqui e poderíamos pegar esse valor de novo do usuário, aí a gente podia passar uma
‫mensagem pra ele, certo?
‫Não lançaríamos nossa exceção.
‫Não faríamos nosso programa travar.
‫Gostaríamos apenas de pedir ao usuário para inserir um novo valor novamente.
‫Mas não estamos fazendo isso aqui porque nós, como programadores, podemos inserir o valor aqui e forçarmos esses erros
‫manualmente agora.
‫Direito.
‫OK, então essa é uma maneira de resolvê-lo ou, na verdade, uma maneira de descobri-lo logo no início.
‫Agora, digamos.
‫Inserimos um valor estúpido aqui, como menos um.
‫Tudo bem, agora vamos executá-lo novamente.
‫Na verdade, vamos executá-lo novamente.
‫E nosso programa parece funcionar, mas não mostra nada ali, então não mostra nada.
‫O Arrows não gerou nenhum erro, mas não mostrou nenhum amigo.
‫Bem, nosso programa parece funcionar com menos um porque tentamos obter os elementos menos um da
‫lista e, bem, isso não nos dá nenhuma informação valiosa.
‫Portanto, agora o que podemos, é claro, fazer é adicionar outra condição aqui.
‫A contagem deve ser Krater igual a zero.
‫Se não for esse o caso, poderíamos escrever algo como o código não pode ser maior que
‫os elementos da lista ou zero menor.
‫OK, então essa é apenas uma maneira de expressar isso.
‫E agora, se o executarmos novamente, lançaremos este erro.
‫OK.
‫Então isso é algo em que o programa não frontera antes, mas agora nós, como desenvolvedores, entendemos, OK, este é
‫um estado que não queremos ter.
‫Esta é uma situação com a qual não queremos trabalhar, certo?
‫E como eu disse, cortaríamos enquanto tentávamos obter esse valor de algum lugar e tentaríamos pegá-lo
‫antes mesmo disso.
‫Agora, vamos supor que temos uma situação ainda mais engraçada.
‫Portanto, temos uma situação em que minha lista de amigos está vazia.
‫Então, vou apenas criar uma lista vazia aqui.
‫Igual a.
‫Agora, isso vai ficar em dúvida e agora que temos essa lista vazia, vamos executá-la novamente e ver se nosso
‫programa ainda funciona.
‫E agora ainda tiramos nosso argumento da exceção do intervalo, então isso é muito legal.
‫Portanto, parece que a exceção que criamos aqui corrige até mesmo esse problema.
‫Portanto, não precisamos examinar manualmente a aparência da lista, mesmo que ela esteja vazia.
‫Direito.
‫Então, se você olhar nossa lista de amigos, nossa lista de amigos está vazia, mas no final, obtemos uma contagem
‫zero.
‫Portanto, embora a lista seja nula, a lista ainda é zero.
‫Portanto, o valor que obtemos ainda é zero.
‫Mas isso não é tudo que podemos realmente fazer agora.
‫Então, em vez de analisar França com França, que é esta lista vazia, podemos passar null aqui.
‫Então, digamos que por algum motivo não pudéssemos criar essa lista porque a conexão com o banco de dados não funcionou ou
‫algo parecido.
‫E nós entramos como resultado.
‫E agora estamos passando agora e tentamos passar agora para um método que realmente requer uma lista.
‫Então, vamos executá-lo e ver que tipo de erro obteremos desta vez.
‫Portanto, agora temos uma referência nula, exceção, referência de objeto, não definida para uma instância de uma lista de objetos
‫era nula.
‫Portanto, a lista pela qual passamos agora era agora.
‫Portanto, obtemos esse erro antes mesmo de lançar um erro.
‫Então, o que poderíamos fazer, é claro, poderíamos pegar essa situação também, então poderíamos seguir em frente
‫e escrever outra instrução if.
‫Se a lista for nula, lance outra exceção de ponteiro.
‫Lança uma nova exceção nula de argumento.
‫Então, lista.
‫A lista está vazia, tudo bem, é claro, pode ser mais descritiva aqui, então a lista não deve
‫estar vazia.
‫Verifique a conexão com a Internet ou algo parecido.
‫Pode ser a conexão com a Internet ou de onde você obtém seus dados.
‫OK.
‫Então, vamos executá-lo novamente, e devemos lançar nossa exceção nula do argumento, como você pode ver, a
‫lista é a lista de parâmetros vazia perfeita.
‫Tudo bem.
‫Agora, você pode se perguntar, por que estamos fazendo tudo isso?
‫Não quero que meu programa trave o tempo todo.
‫Bem, fazemos isso para que nosso programa não entre no estado em que realmente mudaria algo no banco
‫de dados.
‫Não estamos mudando nada no banco de dados e em nosso pequeno programa.
‫Mas imagine que seria o caso então.
‫É uma situação muito diferente e podemos criar alguns problemas graves aqui.
‫Agora, eu quero mostrar a vocês uma coisa final, porque antes tínhamos tudo isso certo, então
‫antes tínhamos essa declaração if e essa e aquela e assim por diante, e antes tínhamos essa lista de amigos.
‫Sim, eu poderia realmente parar antes que tivéssemos esses amigos aqui e passássemos por amigos ali, e então tentamos ter 10
‫amigos em nossa festa, mas só temos sete amigos.
‫Então essa situação, uma vez que rodamos, o que podemos fazer é forçar esse erro que tínhamos e o erro estava em nosso
‫get party friend.
‫OK, então tiramos este argumento do intervalo.
‫O índice de exceção estava fora de alcance.
‫Esse é um problema que tínhamos antes de corrigi-lo.
‫Direito.
‫Mas agora o interessante que podemos observar é a pilha de chamadas.
‫Portanto, há algo chamado pilha de chamadas.
‫E deixe-me torná-lo um pouco maior aqui, na verdade.
‫Quer dizer, feche tudo isso.
‫Portanto, agora vamos examinar esta pilha de chamadas.
‫Esta pilha de chamadas aqui diz que estamos atualmente na linha 46.
‫Tudo bem.
‫É onde estamos.
‫Portanto, devemos obter um método diferente.
‫Agora, se formos um passo acima, podemos ver que é aqui que o método party front foi chamado.
‫Agora estamos dentro do método plural get party friends.
‫E o que queremos saber onde esse método foi chamado.
‫Bem, foi chamado na linha 13.
‫Assim, com a pilha de chamadas, podemos ver de onde fomos chamados, de onde fomos chamados novamente e assim por
‫diante.
‫Portanto, podemos subir até o nível que desejarmos.
‫O método inicial foi chamado e o método inicial foi chamar os amigos da festa.
‫Então entramos neste loop while, get party friend é chamado e entramos neste método aqui.
‫E, finalmente, nossa variável é criada com base em uma lista que está vazia.
‫OK, tudo bem.
‫Espero que isso tenha lhe dado uma pequena introdução à depuração.
‫Claro, há muito mais para saber, mas não quero aborrecê-lo com todos os detalhes
‫porque algumas coisas são úteis.
‫Mas muitos deles não serão necessários no seu dia a dia porque, quer dizer, em geral, você pode, é claro, ir
‫em frente e ir para depurar e, em seguida, verificar todas as diferentes janelas que você pode obter aqui e
‫você pode examine as ameaças que estão sendo executadas em paralelo, os processos e assim por diante.
‫Mas acho que o que você está vendo agora realmente vai ser as coisas principais ou vai ser as coisas
‫principais que você vai precisar, as principais ferramentas que você vai precisar para depurar
‫seu software.
‫Tudo bem.
‫Espero que tenham gostado e possam fazer uso disso em seus programas futuros.
‫E agora você pode finalmente ver como a depuração é resolvida.
‫E, a propósito, obrigado por dar esse feedback, porque recebi o feedback de que uma seção de depuração
‫estava faltando, então decidi criar esta pequena seção.
‫Então, muito obrigado pelo feedback.
‫Se você acha que algo está faltando neste curso ou se acha que algo está muito ruim,
‫por favor, não me dê uma avaliação ruim diretamente.
‫Mas me diga o que é para que eu possa aprimorar o curso, pois meu objetivo é fazer com que isso seja o
‫melhor aproveitamento, claro, do mercado.
‫Então, muito obrigado pela ajuda e espero vê-lo no próximo vídeo.