1

formulo mi pregunta puesto que con el siguiente recorrido, con el que no he tenido problemas en c++ estoy teniendo problemas al usarlo en java.

private Arma obtenerArmaPoderosa(Arbol<Arma> armas) throws ArmaException {
    Arma a = new Arma(0,"");
    Arbol<Arma> aux;

    if(!armas.vacio()) {
        if((aux = armas.getHijoIzq()) != null) {
            obtenerArmaPoderosa(aux);
        }

        if(aux.getRaiz().getPoder() > a.getPoder()) {
            a.setNombre(aux.getRaiz().getNombre());
            a.setPoder(aux.getRaiz().getPoder());
        }

        if((aux = armas.getHijoDer()) != null) {
            obtenerArmaPoderosa(aux);
        }
    }

    return a;
}

Es un recorrido en orden de un arbol de tipo armas que tiene dos atributos: nombre y poder. El arbol pasado por parametros está ordenado por el nombre de las armas (alfabeticamente), necesito en esta ocasión quedarme con el arma de mayor poder. Pero por alguna razón me da un null pointer exception que me tiene un poco frustrado. Gracias de antebrazo.

Nito
  • 11
  • 3
  • 1
    Estos métodos recursivos tienen su truco...a ver, un problema que veo a simple vista es que estás llamando a `obtenerArmaPoderosa` sin guardar en ningun sitio el valor de retorno de la función. Probablemente debas almacenarlo en `a`. – Pikoh Jun 04 '18 at 15:54
  • @Pikoh llamo de forma recursiva, pasando por parametros el subarbol elegido en cada caso por el recorrido en el arbol aux, en el arma a guardo la mejor hasta ahora, si se ha modificado ese valor, debería seguir actualizado con cada llamada recursiva ¿no? – Nito Jun 04 '18 at 15:59
  • Le pasas en aux el subarbol, que no modificas en el método, y devuelves un Arma que no usas en ningun sitio. El ambito de `a` es el método, con lo que en cuanto llamas al método recursivo el valor de a se inicializa de nuevo – Pikoh Jun 04 '18 at 16:06
  • @PabloLozano Ya la habia visto antes, pero con eso no logré solucionar nada, el problema que planteo es algo más especifico por el tema de arboles y recursividad. Gracias igualmente – Nito Jun 04 '18 at 16:08
  • Te recomiendo de todas maneras que crees un [mcve] para que podamos revisar tu código, y por otro lado muchas veces al hacerlo tu mismo descubres el problema. Puedes usar un fiddle como por ejemplo [este](https://www.jdoodle.com/online-java-compiler) y es mas probablem que encuentres solución – Pikoh Jun 04 '18 at 16:12
  • @Pikoh lo modifico con aux = arbol.hijoIzq() o hijoDer(), hasta donde tengo entendido es lo mismo que hacer aux = arbol.hijoX() e if(aux!=null). Corrigeme si me equivoco. Por otro lado tiene sentido lo que comentas sobre a, acostumbro a trabajar con c++ y tengo entendido que en java si necesito devolver algo hay que utilizar un return a la fuerza ya que no hay parametros de entrada/salida como en c++. Si esto es correcto, como podría mantener actualizada la variable a? Gracias – Nito Jun 04 '18 at 16:15
  • @Pikoh de acuerdo. Gracias! – Nito Jun 04 '18 at 16:16
  • 1
    @Nito, si tienes un NPE, primero averigua por qué... el resto de la solución seguramente lo verás a partir de ahí – Pablo Lozano Jun 04 '18 at 16:17

0 Answers0