ayuda con recursividad

Bueno amigos el caso es que estoy viendo recursividad (en esta caso cadeas), tengo que calcular la longitud de una cadena, logicamente parece que esta bien pero no se donde esta el error, me pueden ayudar?

import javax.swing.*;
import java.io.*;
import java.util.*;

public class Prueba {

    public int longi(String cad,int pos) {
        //int ad=cad.length();
        if (cad.charAt(pos)!='\0') {
            return longi(cad, pos+1);
        } else {
            return pos;
        }
    }
    public static void main( String args[] ) {
        String s = new String( "hello" );
        Prueba obj=new Prueba();

        // System.out.println(""+obj.longi(s,0));
        obj.longi(s,0);

        System.exit( 0 );
    }

}

El error que me marca es
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
GRACIAS

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Ahhh pues es que eso es lo

Ahhh pues es que eso es lo que pasa cuado copias código así nomás sin entenderlo ni nada.

Lo que copiaste funcionaba en C donde las cadenas terminan con el caracter '\0' pero en Java esto no tiene sentido entonces el método sigue llamandosé así mismo aún más allá de su límite. Como la cadena "hello" mide 5 caracteres y tu intentas acceder a la 6ta ( en Java la primera posición es la 0, la segunda la 1 etc. )

Quizá necesites otro ejemplo porque en Java la longitud de una cadena se obtiene con el método "length()" y no hay forma de crear una condición que haga sentido para detener la recursividad.

Lo que podrías hacer es una función recursiva para buscar algún caracter:

    /** Regresa el indice que ocupa el caracter c en la cadena string o -1 si no se encuentra */
    public int indexOf( String  string , char c, int currentPosition )  {

        //Primero hay que establecer las condiciones de salida:
       
        // Si la cadena es nula, regresamos -1, no encontrado.
        if ( string == null ) {
            return NOT_FOUND;
        }
        // Si la cadena es vacía, regresamo -1 , no encontrado
        if ( string.equals("") ) {
            return NOT_FOUND;
        }

        // Luego vemos si ya excedimos el límite ( por ejemplo si la cadena mide 5 y ya estamos en el 6to )
        if ( currentPosition >= string.length() ) {
            return NOT_FOUND;
        }

        // Finalmente ya podemos revisar si ya encontramos el caracter
        if ( string.charAt( currentPosition ) == c ) {
            return currentPosition;
       }

        // Si no fue ninguna entonces busca recursivamente:
        return indexOf( string, c, currentPosition + 1 );
    }

También se puede escribir las condiciones donde no se encuentra en una sola sentencia. Aquí va el ejemplo completo:

//por cierto no hace falta importar paquetes que no uses
class EjemploRecursivo {

    public static final int NOT_FOUND = -1;

    public int indexOf( String  string , char c, int currentPosition )  {
        // Si la cadena es nula o vacía o ya nos pasamos del límite
        // entonces regresamos -1, no encontrado.
        if ( string == null || string.equals("") ||  currentPosition >= string.length()) {
            return NOT_FOUND;
        }
        // Podemos tambien usar el operador ternario:  cond ? siDaTrue : siDaFalse
        return string.charAt( currentPosition ) == c ? currentPosition : indexOf( string, c, currentPosition +1 );
    }

    // probarlo
    public static void main( String ... args ) {
        EjemploRecursivo ejemplo = new EjemploRecursivo();
        System.out.println( ejemplo.indexOf( "hello",  'l', 0 )); // regresa 2, porque esa es la primera posición de 'l'
    }
}

También se puede abusar del operador ternario y ponerlo todo en una sola expresion:

class EjemploRecursivo {

    public static final int NOT_FOUND = -1;

    public int indexOf( String  string , char c, int currentPosition )  {
        return  string == null
             || string.equals("")
             || currentPosition >= string.length()  
                 ?  NOT_FOUND  
                 :  string.charAt( currentPosition ) == c
                     ? currentPosition
                     : indexOf( string, c, currentPosition +1 );
    }

    // probarlo
    public static void main( String ... args ) {
        EjemploRecursivo ejemplo = new EjemploRecursivo();
        System.out.println( ejemplo.indexOf( "hello",  'l', 0 )); // regresa 2, porque esa es la primera posición de 'l'
    }
}

Pero ya se hace menos legíble :)

Aquí te dejo un link para leer más al respecto: Para entender la recursividad, primero hay que entender la recursividad

Imagen de sanlegas

gracias oscar

Pues si es que primero aprendi c y pues se como java esta basado en c, dije a de ser lo mismo, pero gracias por tomarte tu timpo y responder y sobre todo poner el link de la recusividad, saludos

Ah vaya... creí que habías

Ah vaya... creí que habías encontrado en Google algo y que le habías hecho copy/paste y ya, sin tratar de entenderlo.

Pero sí, esa es una diferencia entre Java y C que al principio parece algo molesta y luego ya ni te acuerdas de ella.