Autor Tema: Java error: method XXX in class BBB cannot be applied to given types; vocales  (Leído 1871 veces)

Demont99

  • Visitante
Muy buenas tardes soy estudiante, y tengo este problema con el código, que me devuelve el error:

Contador.java:44: error: method cuentaVocales in class Contador cannot be applied to given types;
                objc.cuentaVocales();

aún no encuentro una respuesta, agradecería su ayuda.



Código: [Seleccionar]
import java.util.Scanner;
public class Contador{
String cadena;


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");
}

public  void cuentaVocales(String cadena){
int vocal = 0;
String vol;

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++;

  }
  vol= ("La cadena tiene: " + vocal + " vocales") ;
}
       vol= ("La cadena tiene: " + vocal + " vocales") ;
       
}


public static void main(String[] args){


    Contador objc = new Contador();

objc.leerCadena();
objc.cuentaVocales();


}
}
« Última modificación: 13 de Abril 2022, 18:53 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Calcular el numero de vocales en java
« Respuesta #1 en: 08 de Octubre 2021, 00:56 »
El método cuentaVocales(), lo has definido indicando que va a recibir una cadena por parámetros:

Citar
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:
Código: [Seleccionar]
objc.cuentaVocales();
Y no es necesario pasársela, porque la clase ya tiene un atributo llamado cadena:
Citar
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.
Citar
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().

Citar
   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.

Citar
   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.
Citar
   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.

Citar
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 null

Pero 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.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".