Problemas com recursão

Meu codigo sempre dá o erro java.lang.NullPointerException,
e não consigo cosertar-lo.
Ta ai o cod

[code] public static Lista ordemCres(Lista lista){
if (lista == null)
return null;

     else{
     
        if(lista.cabeça() <= lista.cauda().cabeça())
           return lista.cauda();
        
        
        else
           return ordemCres(lista.cauda());
     }
  }

[/code]
Alguem ai pode me dar uma força
Valeu

Ajuda se você postar o erro. Especialmente a parte que diz em qual linha tá dando o erro, mas parece-me que lista.cauda() na linha 7 está retornando nulo. Posta essa classe Lista ou pelo menos o método cauda().

A classe lista

[code] class Lista{
private int cabeça;
private Lista cauda;

   Lista(int cabeça, Lista cauda){
     this.cabeça = cabeça;
     this.cauda = cauda;
  }

   public int cabeça (){
  
     return cabeça;
  }
   public Lista cauda (){
  
     return cauda;
  }

}[/code]

E a classe programa

[code] [list]class programa{

   public static Lista construir(int cabeça, Lista cauda){ 
    
     return new Lista(cabeça, cauda);
  }

  
  
   public static void mostrar (Lista lista){
     if (lista == null)
        return;
     
     else{
        System.out.println(lista.cabeça());
        mostrar(lista.cauda());
     }
  
  }
  
   public static Lista ordemCres(Lista lista){
     if (lista == null)
        return null;
     
     else{
     
        if(lista.cabeça() <= lista.cauda().cabeça()){
           return lista;
        }
        
        else
           return ordemCres(lista.cauda());
     }
  }

   public static void main (String args[]){
  
     Lista lista = construir(1,null);
     lista = construir(5,lista);
     lista = construir(8,lista);
     lista = construir(9,lista);
  
     ordemCres(lista);
     System.out.println("");
     mostrar(lista);
  } 

}[/code][/list]

Ja ia esquecer do erro

Exception in thread "main" java.lang.NullPointerException
[i]at programa.ordemCres(programa.java:27)
at programa.ordemCres(programa.java:32)
at programa.ordemCres(programa.java:32)
at programa.ordemCres(programa.java:32)
at programa.main(programa.java:43)

[/i]

Na linha 38 no seu método main você passa um ‘null’ como referência. Como é de se esperar ocorre um NullPointerException por causa disso.

não resolvido

[quote=fra]Meu codigo sempre dá o erro java.lang.NullPointerException,
e não consigo cosertar-lo.
Ta ai o cod

[code] public static Lista ordemCres(Lista lista){
if (lista == null)
return null;

     else{
     
        if(lista.cabeça() <= lista.cauda().cabeça())
           return lista.cauda();
        
        
        else
           return ordemCres(lista.cauda());
     }
  }

[/code]
Alguem ai pode me dar uma força
Valeu[/quote]

Tenta assim, vê se resolve:

[code] public static Lista ordemCres(Lista lista){
if (lista == null)
return null;

     else{
        Lista cauda =  lista.cauda();
        if( cauda != null && lista.cabeça() <= lista.cabeça()){
            return lista.cauda();
        }      
        else
           return ordemCres(lista.cauda());
     }
  }

[/code]

Valeu rmendes08
agora ta funcionando direitinho

Tem que tomar muito cuidado com esse tipo de construção:

lista.cauda().cabeça()

embora seja suscinto, há o risco de null pointer exception caso a primeira chamada retorne nulo. Assim, você só deve usar esse tipo de construção quando tiver certeza absoluta que não será retornado o valor null na primeira chamada.

[quote=rmendes08][code] public static Lista ordemCres(Lista lista){
if (lista == null)
return null;

     else{
        Lista cauda =  lista.cauda();
        if( cauda != null && lista.cabeça() <= lista.cabeça()){
            return lista.cauda();
        }      
        else
           return ordemCres(lista.cauda());
     }
  }

[/code][/quote]
Há 2 problemas com seu código:

  1. Você cria uma variável cauda e não a reusa nas linhas 8 e 11;
  2. comparação redundante na linha 7:lista.cabeça() <= lista.cabeça()Ou seja, com essas modificações e seguindo a lógica da versão inicial, ele poderia ficar assim:

[code] public static Lista ordemCres(Lista lista) {
if (lista == null) {
return null;
}

	Lista cauda = lista.cauda();
	if (cauda != null && lista.cabeça() <= cauda.cabeça()) {
		return cauda;
	}
	
	return ordemCres(cauda);
}

[/code]E, fra, tudo o que esse método faz é percorrer a lista até achar uma cauda maior ou igual a cabeça ou nula e retorná-la. Pelo nome, imagino que você queria ordená-la.
Mais uma coisa. Estudo os padrões java:
Use “Programa” e não “programa” para nome de classe;
Não use “ç”, coloque “cabeca” mesmo.

Por fim, parabéns pela iniciativa de tentar fazer o exercício sozinho, ao contrário de muitos que entram aqui pra pedir tudo de mão beijada.
dica: Depois de fazer sua própria estrutura da lista encadeada, dê uma olhada no código da LinkedList do java, que é uma lista circular duplamente encadeada.

Valeu ozix pelas dicas. Tambem ja havia percebido q não tava fazendo totalmente o q eu queria.
O objetivo do exercio é verificar através de métodos recursivos se uma lista está em ordem crescente.
Pensei em fazer uma classe do tipo boolean, mas não deu muito certo.
Mais um favorzinho vc sabe onde possso aprender mais sobre algoritmos recursivos, pois não mando muito bem
Flw

Fiz o msm codigo so q agora em boolean acho q funciona

     public static boolean ordenado(Lista lista){
         if(lista == null || lista.cauda() == null)
            return true;
         
         else
            return (lista.cabeca() <= lista.cauda().cabeca() && ordenado(lista.cauda()));
      
      }

Mas se alguem souber onde posso aprender mais sobre algoritmos recursivos melhor ainda.