El método cuentaVocales(), lo has definido indicando que va a recibir una cadena por parámetros:
public void cuentaVocales(String cadena){
int vocal = 0;
String vol;
for(int i=0; i<cadena.length(); i++){
Pero luego al invocarlo no le pasas ninguna cadena:
objc.cuentaVocales();
Y no es necesario pasársela, porque la clase ya tiene un atributo llamado cadena:
public class Contador{
String cadena;
Pero como a ese método le has dicho que recibirá un String, pues es lo que está esperando.
Has de cambiar su definición, dejando el paréntesis vacío, para que sepa que no va a recibir ninguna cadena, si no que ha de trabajar con la que se ha declarado como atributo de clase.
public void cuentaVocales(String cadena){
Sin embargo, aún veo dos errores más que conviene corregir.
En ese método cuentaVocales(), usas un String llamado vol para, aparentemente, guardar un mensaje con el resultado del conteo de vocales.
Pero luego ese String no se retorna, ni se muestra en pantalla, ni nada.
Así que no sirve para nada, ni tendrá ningún impacto en pantalla. El conteo se hará, pero no se verá ningún resultado.
No necesitas ningún String, simplemente hay que contar vocales y al terminar lanzar el mensaje a la pantalla con un println().
public void cuentaVocales(){
int vocal = 0;
for(int i=0; i<cadena.length(); i++){
if((cadena.charAt(i) == 'a') || (cadena.charAt(i) == 'A') ||
(cadena.charAt(i) == 'e') || (cadena.charAt(i) == 'E') ||
(cadena.charAt(i) == 'i') || (cadena.charAt(i) == 'I') ||
(cadena.charAt(i) == 'o') || (cadena.charAt(i) == 'O') ||
(cadena.charAt(i) == 'u') || (cadena.charAt(i) == 'U') ){
vocal++;
}
}
System.out.println("La cadena tiene: " + vocal + " vocales");
}
Bien, con esto parece que el método cuentaVocales() ya estaría listo para cumplir con lo que esperamos. Pero me temo que no va conseguir dar buenos resultados.
Y esto se debe a un error en el otro método, en leerCadena().
Este método debería leer una cadena por teclado y guardarla en el String declarado como atributo de clase.
Pero dentro del método, has declarado otro String con el mismo nombre que el atributo.
public void leerCadena(){
String cadena;
int longitudCadena;
Por consiguiente, el método NO trabajará con el atributo, si no con este otro String.
Y esto implica que cuando el método cuentaVocales() quiera cumplir con su cometido, se va a encontrar con que el atributo String cadena, no tiene ningún valor. Porque la cadena leída por teclado no se ha guardado en este atributo.
Así que hay que eliminar esa declaración del String que está dentro del método. De este modo, se trabajará con el atributo de clase, que es lo que necesitamos.
public void leerCadena(){
String cadena;
int longitudCadena;
Scanner sc = new Scanner(System.in);
System.out.println("Ingrese cualquier cadena para contar sus vocales");
cadena= sc.nextLine();
longitudCadena = cadena.length();
System.out.println("La cadena tiene: " + longitudCadena + " caracteres");
}
Por cierto, aunque en este ejercicio creo que no es estrictamente necesario, no estaría de más incluir un constructor de clase.
Siempre que una clase tenga atributos (o sea, casi siempre), es conveniente crear un constructor para dar un valor inicial a dichos atributos.
import java.util.Scanner;
public class Contador{
String cadena;
//Constructor de clase
public Contador() {
cadena = ""; //Inicializamos con una cadena vacía
}
public void leerCadena(){
String cadena;
int longitudCadena;
Scanner sc = new Scanner(System.in);
System.out.println("Ingrese cualquier cadena para contar sus vocales");
cadena= sc.nextLine();
longitudCadena = cadena.length();
System.out.println("La cadena tiene: " + longitudCadena + " caracteres");
}
De esta manera, nos aseguramos de que los atributos no se quedan con valores nulos (null).
En tu ejercicio, en principio no pasaría nada, porque primero llamas al método de leerCadena(), que ya se encarga de dar un valor a la cadena y deja de ser
nullPero supón que alguien escribe su propio programa usando tu clase, y ofrece un menú de opciones donde el usuario puede elegir llamar al método de cuentaVocales() sin haber leído ninguna cadena previamente.
Si no le damos un valor inicial al atributo "cadena", el método de contar vocales intentará contar vocales en un atributo con valor null, lo cuál producirá una excepción (un error) y el programa romperá su ejecución.
En cambio, si nos aseguramos de dar un valor inicial en el constructor, ya no tendremos valores null y el programa no se romperá si se intenta contar vocales sin haber leído una cadena.
Simplemente obtendremos el mensaje de que la cadena tiene 0 vocales, lo cuál sería correcto ya que aún no se ha leído ninguna cadena.
Realizar todos estos cambios y prueba ahora a ver si funciona bien.
Si alguna explicación no te ha quedado clara, solo tienes que volver a preguntar.
Un saludo.