Java控制台请求与输入同行时的输入校验输出异常问题
问题解决:控制台输入提示与错误输出格式错乱
问题根源
你的代码同时使用了System.out(正常输出流)和System.err(错误输出流),这两个是独立的控制台输出流,各自的缓冲机制不同,导致输出顺序无法保证,才会出现错误提示跑到下一个输入提示后面的错乱情况。
修复后的代码
将错误输出统一改为System.out,保证输出流一致,即可解决格式问题:
import java.util.Scanner; public class Main { final static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { run(); } public static void run() { System.out.println("GREETINGS"); handleAccountExistence(); } public static void handleAccountExistence() { String response; do { System.out.print("Do you have an account? (y/n): "); response = scanner.nextLine(); } while (!isValidResponse(response)); if (response.equalsIgnoreCase("y")) { System.out.println("enter username"); } else { System.out.println("register need"); } } public static boolean isValidResponse(String input) { if (input.equalsIgnoreCase("y") || input.equalsIgnoreCase("n")) { return true; } else { // 改用System.out输出错误信息,保证流同步 System.out.println("INVALID_INPUT: please enter 'y' or 'n'."); return false; } } }
修复后输出效果
GREETINGS Do you have an account? (y/n): 45 INVALID_INPUT: please enter 'y' or 'n'. Do you have an account? (y/n): 54 INVALID_INPUT: please enter 'y' or 'n'. Do you have an account? (y/n):
补充说明
如果需要保留System.err的红色错误输出(部分控制台支持),可以手动刷新两个流强制同步顺序,不过这种方式依赖控制台实现,稳定性不如统一用System.out:
public static boolean isValidResponse(String input) { if (input.equalsIgnoreCase("y") || input.equalsIgnoreCase("n")) { return true; } else { System.out.flush(); System.err.println("INVALID_INPUT: please enter 'y' or 'n'."); System.err.flush(); return false; } }
内容的提问来源于stack exchange,提问作者Ruzvelt
相关产品推荐
相关产品推荐

