Поведение оператора switch в java

190
10 сентября 2018, 14:40

Почему меняется поведение оператора switch при различных способах инициализации управляющей переменной?

В первом случае, когда переменной сразу присваивается значение - char a = '1'; - все работает как надо.

А во втором, когда значение получается через - char a = (char) br.read(); - выполнение case'ов начинается со второго метода, т.е. я не могу указать путь к файлу( первый метод как-бы пропускается). В обоих случаях тип переменной char и выбор кейсов происходит правильно. В чем может быть причина?

package task5;
import java.io.*;
public class Main {
    private String pathToFile;
    private String dataToWrite;
     private void getFilePath(BufferedReader bufferedReader) {
        try {
            pathToFile = bufferedReader.readLine();
        } catch (IOException e) {
            System.out.println("getFilePath Error " + e);
        }
    }
    private void getDataToWrite(BufferedReader bufferedReader) {
        try {
            dataToWrite = bufferedReader.readLine();
        }catch (IOException e) {
            System.out.println("getDataToWrite Error " + e);
        }
    }
    private void writeToFile(String path, String data) {
        try (FileWriter fw = new FileWriter(path)) {
            fw.write(data);
            fw.flush();
        } catch (IOException e) {
            System.out.println("writeToFile Error " + e);
        }
    }
    private void readFromFile() {
        try (FileReader fw = new FileReader(pathToFile)) {
            int c;
            StringBuilder res = new StringBuilder();
            do {
                c = fw.read();
                res.append((char) c);
            } while (c !=  -1);
            System.out.println(res);
        } catch (IOException e) {
            System.out.println("FileReader Error " + e);
        }
    }
    public static void main(String[] args) throws IOException {
        String menu = "Выберите необходимое действие: \n" +
                        "1 - записать файл; \n" +
                        "2 - прочитать файл; \n";
        System.out.println(menu);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Выберите вариант.");
        Main m = new Main();
        //char a = '1'; все работает
        char a = (char) br.read(); //пропускается первый метод
        switch (a) {
            case '1':
                System.out.println("Введите путь к файлу.");
                m.getFilePath(br);
                System.out.println(m.pathToFile);
                System.out.println("Введите данные для записи.");
                m.getDataToWrite(br);
                System.out.println(m.dataToWrite);
                m.writeToFile(m.pathToFile, m.dataToWrite);
                break;
            case '2':
                System.out.println("Введите путь к файлу.");
                m.getFilePath(br);
                System.out.println(m.pathToFile);
                m.readFromFile();
                break;
        }
    }
}
Answer 1
 char a = br.readLine().charAt(0);

read() вычитывает только один символ, в данном случае '1'. В остатке остается еще перенос строки. И когда вызывается pathToFile = bufferedReader.readLine(), то проверяется осталось ли что-то в остатке если да, то выводим иначе ждем ввода.

Answer 2

Попробуйте

String a = br.readLine();
READ ALSO
Подключение встроенных пакетов java

Подключение встроенных пакетов java

Вот импорт, и он подсвечивается и параллельно выкидывает о

190
Java Spring Security 5 OAuth2 авторизация с помощью google и facebook

Java Spring Security 5 OAuth2 авторизация с помощью google и facebook

Я прочел этот туторчик и тоже решил сделать авторизацию через гугл и файсбук в своем тестовом приложенииЯ абсолютно се сделал как в гайде

239
Удаление дубликатов по полю объекта Stream API

Удаление дубликатов по полю объекта Stream API

У нас есть список объектов доменной области (Person)У объекта Person есть 3 поля: id, имя, фамилия

260