Java - «переменное имя» не может быть преобразовано в переменную - я не могу найти, где моя ошибка - PullRequest
1 голос
/ 06 марта 2019

Я прочитал другие вопросы с таким же названием, но ни один из них не помог с моей проблемой, и ничто в Интернете не помогло.

Я новичок в Java и пытаюсь запустить основную программу, но продолжаюполучение вышеупомянутой ошибки.

Код ниже.

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

}

Где написано toggleStringCase (input);где я получаю сообщение об ошибке, пытаясь передать переменную в функцию.

Ничто из того, что я прочитал, не говорит о том, что я могу делать неправильно.

Я уверен, что это должна быть основная ошибка, ноМожет ли кто-нибудь, пожалуйста, указать мне правильное направление.

Я где-то пропустил какой-то синтаксис?

Ответы [ 4 ]

4 голосов
/ 06 марта 2019

input имеет только область в блоке try, переместите вызов туда.Кроме того, я бы предпочел try-with-resources явному закрытию in с другим блоком try. Но , следует отметить, что закрытие in также закрывает System.in (что является глобальной переменной), и при этом следует соблюдать особую осторожность (поскольку любые будущие попытки чтения из System.in будутошибка)

try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) {
    String input = in.readLine();
    toggleStringCase(input);
} catch (IOException e) {
    e.printStackTrace();
}
2 голосов
/ 06 марта 2019

переменная input не может быть преобразована в переменную, поскольку у вас нет переменной input в области действия вашего метода main (область, в которой вы используете переменную input в качестве параметраtoggleStringCase метод).У вас есть только переменная input в области действия try, что означает, что переменная input доступна только в пределах try, и поскольку вы используете переменную input вне try, поэтому она создаетошибка.

Существует два возможных способа исправить это:

  • Чтобы это исправить, вы должны переместить объявление переменной input в область действия вашего метода main.Я обновил ваш код ниже:
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;
    }

}
  • Или вы можете переместить вызов функции на toggleStringCase внутри вашего try-catch.См. Код ниже.
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;
    }

}
1 голос
/ 06 марта 2019

Вы должны переместить вашу переменную [input] в вашу область видимости.потому что вы объявляете это внутри блока try, но хотите использовать его вне области действия.

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

}

1 голос
/ 06 марта 2019

классический пример проблемы объема.Ввод var доступен только внутри блока try или того, что находится под фигурными скобками {} Переместите toggleStringCase(input); в блок try самого ввода

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

Или вы можете объявить вход String вне блока try с некоторымизначение по умолчанию / init, например

String input = "default value";// moved
try {
    input = in.readLine();
    toggleStringCase(input); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...