Depuração de código
Prof. Leonardo Soares e Silva
Problema
public double somarIdades(){
Pessoa leonardo = Database.getPessoaFromDb(78);
Pessoa joaquim = null;
Double idade = leonardo.getIdade() + joaquim.getIdade();
return idade;
}
1) Qual erro pode ocorrer?
R - NullPointerException
Problema
public double somarIdades(){
Pessoa leonardo = Database.getPessoaFromDb(78);
Pessoa joaquim = Database.getPessoaFromDb(79);
Double idade = leonardo.getIdade() + joaquim.getIdade();
return idade;
}
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
Problema
public ControleCurso() {
curso = new Curso();
selecionado = null;
dao = new CursoDao();
List<Aluno> listaAlunos = new ArrayList<Aluno>();
try {
for (int i = 0; i < alunoDao.recuperarTodos().size(); i++) {
Aluno obj = alunoDao.recuperarTodos().get(i);
if (obj.getAtivo() == 1) {
listaAlunos.add(obj);
}
}
} catch (Exception e) {
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao obter a lista de Cursos.", ""));
}
alunosAtivos = new ArrayList<Aluno>(listaAlunos);
List<Servidor> listaServidores = new ArrayList<Servidor>();
try {
for (int i = 0; i < servidorDao.recuperarTodos().size(); i++) {
Servidor obj = servidorDao.recuperarTodos().get(i);
if (obj.getAtivo() == 1) {
listaServidores.add(obj);
}
}
} catch (Exception e) {
FacesContext ctx = FacesContext.getCurrentInstance();
Problemas

Sabemos onde estão nossos erros, pois o Java nos avisa
Estes avisos, para quem tem pouca experiência, podem ser
difíceis de interpretar
Além disto não sabemos exatamente o que levou eles a
ocorrerem
Como resolver

Sabendo os valores das variáveis no momento de
execução
Saber o comportamento de nosso código
Entendendo o que está acontecendo
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
Session = null
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
II - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
Session != null
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
I - Simulação de execução de um
código
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
P = Objeto Pessoa
Depuração de código
Depuração de código
Como funciona a depuração
Corrigir o
problema

Executar o
software

Identificar
onde está o
erro

Localizar o
problema

Ir passo a
passo
durante a
execução do
código

Marcar o
trecho do
código que
queremos
“assistir”
Conceitos importantes

Ponto de parada (break point)
Passar dentro (Step in)
Passar fora (Step out)
Passar por fora (Step over)
Continuar (Continue)
Ponto de parada

Especifica onde queremos que a execução do nosso
software pare
A partir deste momento iremos depurar nossa
aplicação
Na maioria das IDEs é destacada com uma linha
vermelha
Podemos colocar quantos quiser
Depuração de código
Depuração do código

Uma vez a execução do software parada, passamos a
executá-lo linha a linha
Na maioria das IDEs a linha em execução é marcada
com a cor verde
É possível entrar em métodos que são invocados
Sair deles
Passar por eles
Linha em execução durante a
depuração
Step in

Visualiza a execução de um método invocado
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
}
Step in

Visualiza a execução de um método invocado
public Session getSession(){
…
…
}
Step out

Sai do passo a passo da execução de um método
entrado através do Step in
Step over

Ignoramos o passo a passo de métodos que são
invocados
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
Step over

Ignoramos o passo a passo de métodos que são
invocados
public Pessoa getPessoaFromDb( int chavePrimaria ){
Session session = Hibernate.getSession();
if( session == null)
return null;
Pessoa p =
PessoaDao.loadFromPrimaryKey(chavePrimaria);
return p;
Continue

Retorna a execução contínua do software
Exemplo de depuração
Exercício

Implementem os códigos e verifiquem o que ocorre
Exercício 01
public class Pessoa {
String cpf;
// gets e setters
}
public static void comparar(){
Pessoa leonardo = new Pessoa(“12345”);
Pessoa leo = new Pessoa(“12345”);
if( leonardo == leo ){
System.out.println("Iguais");
}
System.out.println(”Diferentes");
}
Exercício 02
public static void main(String[] args) {
String nomes[] = new String[3];
nomes[1] = "disciplina";
nomes[2] = "teste";
nomes[3] = "software";
}
Considerações sobre a depuração

A utilizamos apenas quando há problemas ou dúvidas
no código
Passado este momento executamos nosso código
normalmente
Exercício para casa

Identifiquem como funciona a depuração no Eclipse
Explicação oral na próxima aula sobre o
funcionamento e conceitos da depuração

Depuração de software

  • 1.
    Depuração de código Prof.Leonardo Soares e Silva
  • 2.
    Problema public double somarIdades(){ Pessoaleonardo = Database.getPessoaFromDb(78); Pessoa joaquim = null; Double idade = leonardo.getIdade() + joaquim.getIdade(); return idade; } 1) Qual erro pode ocorrer? R - NullPointerException
  • 3.
    Problema public double somarIdades(){ Pessoaleonardo = Database.getPessoaFromDb(78); Pessoa joaquim = Database.getPessoaFromDb(79); Double idade = leonardo.getIdade() + joaquim.getIdade(); return idade; } public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 4.
    Problema public ControleCurso() { curso= new Curso(); selecionado = null; dao = new CursoDao(); List<Aluno> listaAlunos = new ArrayList<Aluno>(); try { for (int i = 0; i < alunoDao.recuperarTodos().size(); i++) { Aluno obj = alunoDao.recuperarTodos().get(i); if (obj.getAtivo() == 1) { listaAlunos.add(obj); } } } catch (Exception e) { FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao obter a lista de Cursos.", "")); } alunosAtivos = new ArrayList<Aluno>(listaAlunos); List<Servidor> listaServidores = new ArrayList<Servidor>(); try { for (int i = 0; i < servidorDao.recuperarTodos().size(); i++) { Servidor obj = servidorDao.recuperarTodos().get(i); if (obj.getAtivo() == 1) { listaServidores.add(obj); } } } catch (Exception e) { FacesContext ctx = FacesContext.getCurrentInstance();
  • 5.
    Problemas Sabemos onde estãonossos erros, pois o Java nos avisa Estes avisos, para quem tem pouca experiência, podem ser difíceis de interpretar Além disto não sabemos exatamente o que levou eles a ocorrerem
  • 6.
    Como resolver Sabendo osvalores das variáveis no momento de execução Saber o comportamento de nosso código Entendendo o que está acontecendo
  • 7.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 8.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; } Session = null
  • 9.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 10.
    II - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 11.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 12.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; } Session != null
  • 13.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 14.
    I - Simulaçãode execução de um código public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; } P = Objeto Pessoa
  • 15.
  • 16.
  • 17.
    Como funciona adepuração Corrigir o problema Executar o software Identificar onde está o erro Localizar o problema Ir passo a passo durante a execução do código Marcar o trecho do código que queremos “assistir”
  • 18.
    Conceitos importantes Ponto deparada (break point) Passar dentro (Step in) Passar fora (Step out) Passar por fora (Step over) Continuar (Continue)
  • 19.
    Ponto de parada Especificaonde queremos que a execução do nosso software pare A partir deste momento iremos depurar nossa aplicação Na maioria das IDEs é destacada com uma linha vermelha Podemos colocar quantos quiser
  • 20.
  • 21.
    Depuração do código Umavez a execução do software parada, passamos a executá-lo linha a linha Na maioria das IDEs a linha em execução é marcada com a cor verde É possível entrar em métodos que são invocados Sair deles Passar por eles
  • 22.
    Linha em execuçãodurante a depuração
  • 23.
    Step in Visualiza aexecução de um método invocado public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p; }
  • 24.
    Step in Visualiza aexecução de um método invocado public Session getSession(){ … … }
  • 25.
    Step out Sai dopasso a passo da execução de um método entrado através do Step in
  • 26.
    Step over Ignoramos opasso a passo de métodos que são invocados public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p;
  • 27.
    Step over Ignoramos opasso a passo de métodos que são invocados public Pessoa getPessoaFromDb( int chavePrimaria ){ Session session = Hibernate.getSession(); if( session == null) return null; Pessoa p = PessoaDao.loadFromPrimaryKey(chavePrimaria); return p;
  • 28.
    Continue Retorna a execuçãocontínua do software
  • 29.
  • 30.
    Exercício Implementem os códigose verifiquem o que ocorre
  • 31.
    Exercício 01 public classPessoa { String cpf; // gets e setters } public static void comparar(){ Pessoa leonardo = new Pessoa(“12345”); Pessoa leo = new Pessoa(“12345”); if( leonardo == leo ){ System.out.println("Iguais"); } System.out.println(”Diferentes"); }
  • 32.
    Exercício 02 public staticvoid main(String[] args) { String nomes[] = new String[3]; nomes[1] = "disciplina"; nomes[2] = "teste"; nomes[3] = "software"; }
  • 33.
    Considerações sobre adepuração A utilizamos apenas quando há problemas ou dúvidas no código Passado este momento executamos nosso código normalmente
  • 34.
    Exercício para casa Identifiquemcomo funciona a depuração no Eclipse Explicação oral na próxima aula sobre o funcionamento e conceitos da depuração

Notas do Editor

  • #4 Qualerropodeocorrer?
  • #16 Écomoassistiraonossocódigosendoexecutado