Skip to content
Advertisement

BufferedReader unexpected behavior

I have an unusual problem with BufferedReader in Java 11. I have a simple command-line student tracker application, that reads input from System.in, transforms it into the appropriate implementation of Command interface, and executes it.

void execute() {
    System.out.println("Learning Progress Tracker");
    try (reader) { // reader is new BufferedReader(new InputStreamReader(System.in))
        String line;
        while (!shutdown) {
            line = reader.readLine();
            Command command = Command.stringToCommand(line);
            if (command instanceof ExitCommand) {
                shutdown = true;
            }
            command.execute(reader, db);
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

Some commands simply process the input and print the output to System.out, some keep using reader to receive additional input. For example, AddStudentsCommand implements execution like so:

 public void execute(BufferedReader reader, Database db) {
        String line;
        String[] credentials;
        int numAdded = 0;
        prompt(); // Prints prompt to System.in to enter credentials
        try {
            while (!(line = reader.readLine()).equals("back")) {

                // process input

            }
        }

    }

Here is the weird part. After while (!(line = reader.readLine()).equals("back")) { line evaluates to true, reader‘s buffer ends up with leading n in its buffer, followed by whatever I typed, which causes to readLine() to fire up twice. And even weirder, that only happens if I comment out prompt() (a simple System.out.println()) prior to readLine(). If some text gets printed to System.out before reading, the buffer behaves correctly and leading n doesn’t show up. I have recorded a small video to show what I mean: https://www.youtube.com/watch?v=H7PBr6Qpykg.

I don’t know what I’m doing wrong and can’t understand where that nasty bug is coming from. Can anyone reproduce?

Advertisement

Answer

This issue only occurs when you run your program in the IDE. If you run it from the command line, using the command java [ClassName], it should work just fine.

The problem is a bug in IntelliJ IDEA which was fixed in version 2022.1.2, so you might want to upgrade.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement