1
votes

Java - le "nom de la variable" ne peut pas être résolu en une variable - je ne trouve pas où se trouve mon erreur

J'ai lu les autres questions portant le même titre mais aucune n'a aidé avec mon problème et rien en ligne n'a aidé non plus.

Je suis nouveau sur Java et j'essaie de faire fonctionner un programme de base, mais je continue à recevoir les éléments susmentionnés erreur.

Code ci-dessous.

package loopy;
import java.io.*;

public class loopy {
    public static void main (String[] args) {
        // TODO: Use a loop to print every upper case letter
        for (int i = 65; i < 91; i++) {
            System.out.println((char)i);
        }
        // TODO: Get input from user. Print the same input back but with cases swapped.
          BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          try {
            String input = in.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        toggleStringCase(input);


    }

    // TODO: Implement this function to return the opposite case of the letter given. DO NOT USE any built in functions.
    // How to handle the case where the char given is not a letter?
    private static char toggleCase(char c) {
        return c;
    }

    // TODO: Implement this function to toggle the case each char in a string. Use toggleCase() to help you.
    private static String toggleStringCase(String str) {
        return str;
    }

}

Où il est dit toggleStringCase (entrée); c'est là que j'obtiens l'erreur en essayant de passer la variable à une fonction.

Rien de ce que j'ai lu ne suggère ce que je pourrais faire de mal.

Je suis sûr que ce doit être un élément de base erreur mais quelqu'un pourrait-il me diriger dans la bonne direction.

Ai-je manqué une syntaxe quelque part?


1 commentaires

4 Réponses :


4
votes

input n'a de portée que dans le bloc try , déplacez l'appel là-bas. De plus, je préférerais un try-with-resources à la fermeture explicite de in avec un autre bloc try. Mais , il convient de noter que la fermeture de dans ferme également System.in (qui est une variable globale) et que le plus grand soin doit être apporté donc (puisque toute tentative future de lecture à partir de System.in échouera)

try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) {
    String input = in.readLine();
    toggleStringCase(input);
} catch (IOException e) {
    e.printStackTrace();
}


1 commentaires

Merci pour ça. Eclipse a ajouté le try / catch automatiquement, donc je n'ai jamais pensé que cela affecterait la portée.



1
votes

classique par exemple du problème de portée. L'entrée var n'est accessible que dans le bloc try ou ce qui se trouve sous les accolades {} Déplacez votre toggleStringCase (input); dans le bloc try de l'entrée elle-même

String input = "default value";// moved
try {
    input = in.readLine();
    toggleStringCase(input); 
}

Ou vous pouvez déclarer l'entrée String en dehors du bloc try avec une valeur par défaut / init comme p>

public class loopy {
    public static void main (String[] args) {
        // TODO: Use a loop to print every upper case letter
        for (int i = 65; i < 91; i++) {
            System.out.println((char)i);
        }
        // TODO: Get input from user. Print the same input back but with cases swapped.
          BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          try {
            String input = in.readLine();
            toggleStringCase(input); // moved

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


0 commentaires

2
votes

La

variable input ne peut pas être résolue en une variable car vous n'avez pas de variable input dans la portée de votre méthode main (la portée dans laquelle vous utilisez la variable input comme paramètre de la méthode toggleStringCase ). Vous n'avez que la variable input dans la portée de votre try ce qui signifie que la variable input n'est accessible que dans le try et puisque vous utilisez la variable input en dehors de try , c'est pourquoi il produit l'erreur.

Il y a 2 façons possibles de résoudre ce problème:

  • Pour résoudre ce problème, vous devez déplacer votre déclaration de variable input dans la portée de votre méthode main . J'ai mis à jour votre code ci-dessous:
package loopy;
import java.io.*;

public class loopy {
    public static void main (String[] args) {
        // TODO: Use a loop to print every upper case letter
        for (int i = 65; i < 91; i++) {
            System.out.println((char)i);
        }
        // TODO: Get input from user. Print the same input back but with cases swapped.
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            String input = in.readLine(); // get the actual input
            toggleStringCase(input); // MOVE IT HERE
        // The try/catch below are commented out since you can combine it to the try/catch above
        // START
        //} catch (IOException e) {
        //    // TODO Auto-generated catch block
        //    e.printStackTrace();
        //}
        //try {
        // END

            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // toggleStringCase(input); // was moved inside try-catch


    }

    // TODO: Implement this function to return the opposite case of the letter given. DO NOT USE any built in functions.
    // How to handle the case where the char given is not a letter?
    private static char toggleCase(char c) {
        return c;
    }

    // TODO: Implement this function to toggle the case each char in a string. Use toggleCase() to help you.
    private static String toggleStringCase(String str) {
        return str;
    }

}
  • Ou vous pouvez déplacer l'appel de fonction pour toggleStringCase dans votre try-catch . Reportez-vous au code ci-dessous.
package loopy;
import java.io.*;

public class loopy {
    public static void main (String[] args) {
        // TODO: Use a loop to print every upper case letter
        String input = ""; // DECLARE input HERE so that it can be used in the scope of your main method
        for (int i = 65; i < 91; i++) {
            System.out.println((char)i);
        }
        // TODO: Get input from user. Print the same input back but with cases swapped.
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            input = in.readLine(); // get the actual input

        // The try/catch below are commented out since you can combine it to the try/catch above
        // START
        //} catch (IOException e) {
        //    // TODO Auto-generated catch block
        //    e.printStackTrace();
        //}
        //try {
        // END

            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        toggleStringCase(input);


    }

    // TODO: Implement this function to return the opposite case of the letter given. DO NOT USE any built in functions.
    // How to handle the case where the char given is not a letter?
    private static char toggleCase(char c) {
        return c;
    }

    // TODO: Implement this function to toggle the case each char in a string. Use toggleCase() to help you.
    private static String toggleStringCase(String str) {
        return str;
    }

}


0 commentaires

2
votes

Vous devez déplacer votre variable [input] vers votre portée. parce que vous le déclarez dans un bloc try, mais que vous voulez l'utiliser hors de la portée.

public class loopy {
public static void main (String[] args) {
    // TODO: Use a loop to print every upper case letter
    for (int i = 65; i < 91; i++) {
        System.out.println((char)i);
    }
    String input=null;
    // TODO: Get input from user. Print the same input back but with cases swapped.
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    try {
        input = in.readLine();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    toggleStringCase(input);


}

// TODO: Implement this function to return the opposite case of the letter given. DO NOT USE any built in functions.
// How to handle the case where the char given is not a letter?
private static char toggleCase(char c) {
    return c;
}

// TODO: Implement this function to toggle the case each char in a string. Use toggleCase() to help you.
private static String toggleStringCase(String str) {
    return str;
}

}


0 commentaires