Java控制台案例

wen java案例 2

Java控制台案例实战指南——构建你的第一个无界面应用

目录导读

  1. 为什么还要学控制台程序?—— 被低估的基石
  2. 环境准备:从JDK到记事本的极致简约
  3. 核心案例一:学生成绩管理系统(数组+循环+方法)
  4. 核心案例二:简易ATM取款机(状态机与用户交互)
  5. 核心案例三:文件读写备份工具(IO流与异常处理)
  6. 调试技巧:控制台程序常见“坑”与排查思路
  7. SEO友好问答:高频Java控制台面试题精解

为什么还要学控制台程序?—— 被低估的基石

在图形界面和Web应用泛滥的今天,很多新手会质疑:为什么还要花时间在黑白终端上写代码?答案在于逻辑纯粹性,控制台程序剥离了CSS、布局、事件监听等“视觉噪音”,让你直击算法本质,搜索引擎(如Google)对“Java控制台案例”的搜索量常年稳定,这说明它依然是教学、面试和快速原型验证的首选场景。

Java控制台案例

核心价值:控制台程序是理解JVM内存模型(栈、堆)、输入输出流、异常链的最佳载体,当你用System.out.println()打印每一行状态时,你实际上在手动执行“Debugger”的工作——这种底层感知力是IDE断点无法替代的。


环境准备:从JDK到记事本的极致简约

必装:JDK 17(LTS版本,支持switch表达式和文本块),无需IDE,记事本或VS Code即可。

验证:命令行输入java -version,若出现版本号则成功。

编译运行三步

javac Main.java   # 编译生成.class字节码
java Main         # 解释执行,注意不需要.class后缀

SEO小贴士:搜索“Java控制台案例”时,Google优先展示带完整代码块运行效果截图的教程,建议你在本地跑通每个案例后,再用代码块格式发布到博客。


核心案例一:学生成绩管理系统(数组+循环+方法)

这是最经典的“破冰”案例,覆盖了90%的基础语法。

需求:输入5个学生成绩,计算平均分、最高分,并输出不及格名单。

import java.util.Scanner;
public class ScoreManager {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double[] scores = new double[5];
        double sum = 0;
        double max = Double.MIN_VALUE;
        System.out.println("请输入5名学生的成绩:");
        for (int i = 0; i < scores.length; i++) {
            System.out.print("第" + (i+1) + "名:");
            scores[i] = sc.nextDouble();
            sum += scores[i];
            if (scores[i] > max) max = scores[i];
        }
        System.out.printf("平均分:%.2f,最高分:%.1f%n", sum/5, max);
        System.out.print("不及格名单:");
        for (double s : scores) {
            if (s < 60) System.out.print(s + " ");
        }
        sc.close();
    }
}

运行示例

请输入5名学生的成绩:
第1名:85.5
第2名:59
...
平均分:72.30,最高分:95.0
不及格名单:59.0

进阶思考:如何用ArrayList实现动态扩容?如何用try-catch拦截非数字输入?这就是Search Console中“相关搜索”的灵感来源。


核心案例二:简易ATM取款机(状态机与用户交互)

此案例完美体现循环中的状态切换,是面试中“写一个死循环直到用户退出”的标准解法。

需求:模拟ATM,初始余额1000,支持查询、存款、取款、退出,取款时校验余额和非法金额。

public class AtmMachine {
    public static void main(String[] args) {
        double balance = 1000;
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        while (flag) {
            System.out.println("\n=== ATM菜单 ===");
            System.out.println("1.查询 2.存款 3.取款 4.退出");
            System.out.print("请选择:");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    System.out.printf("当前余额:%.2f元%n", balance);
                    break;
                case 2:
                    System.out.print("存款金额:");
                    double dep = sc.nextDouble();
                    if (dep > 0) balance += dep;
                    else System.out.println("金额必须为正!");
                    break;
                case 3:
                    System.out.print("取款金额:");
                    double wit = sc.nextDouble();
                    if (wit <= 0) System.out.println("非法金额!");
                    else if (wit > balance) System.out.println("余额不足!");
                    else {
                        balance -= wit;
                        System.out.println("取款成功,剩余:" + balance);
                    }
                    break;
                case 4:
                    System.out.println("感谢使用,再见!");
                    flag = false;
                    break;
                default:
                    System.out.println("无效选项!");
            }
        }
        sc.close();
    }
}

关键点while(flag)配合flag=false优雅退出,避免break跳出循环却无法执行收尾代码的尴尬。


核心案例三:文件读写备份工具(IO流与异常处理)

此案例让控制台程序“走出内存”,接触真实磁盘,是SEO关键词“Java控制台案例”中技术含量最高的部分。

需求:将data.txt内容复制到backup.txt,并统计行数。

import java.io.*;
public class FileBackup {
    public static void main(String[] args) {
        String src = "data.txt";
        String dst = "backup.txt";
        int lineCount = 0;
        try (BufferedReader reader = new BufferedReader(new FileReader(src));
             BufferedWriter writer = new BufferedWriter(new FileWriter(dst))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
                lineCount++;
            }
            System.out.println("备份完成,共" + lineCount + "行。");
        } catch (FileNotFoundException e) {
            System.err.println("源文件不存在:" + e.getMessage());
        } catch (IOException e) {
            System.err.println("读写错误:" + e.getMessage());
        }
    }
}

SEO解析:用try-with-resources(Java 7+)自动关闭资源,这是Google抓取代码时识别“高质量内容”的语法特征之一,异常捕获务必从具体到一般,FileNotFoundException在前,IOException在后。

注意运行前需在当前目录手动创建data.txt,否则会触发异常分支。


调试技巧:控制台程序常见“坑”与排查思路

  1. 中文乱码:编译时加-encoding UTF-8,即javac -encoding UTF-8 Main.java
  2. Scanner的nextInt与nextLine混用nextInt()不会消费换行符,导致后续nextLine()读到空字符串。解法:在nextInt()后加一句sc.nextLine()
  3. 死循环导致CPU飙高:检查循环变量是否更新,或while条件是否恒真。
  4. 路径错误:文件和代码不在同一目录时,使用绝对路径或System.getProperty("user.dir")打印工作目录。

SEO友好问答:高频Java控制台面试题精解

Q1:如何在控制台实现“输入密码时不显示字符”?

原生Java无法直接实现,因为System.in不支持echo关闭。最佳实践:使用Console类(System.console().readPassword()),但注意IDE中System.console()可能为null,这是考察你对API边界认知的经典题。

Q2:控制台程序如何接收“命令行参数”?

main(String[] args)中,参数以数组传入,例如运行java Main 100 abc,则args[0]="100"args[1]="abc",需要手动转Integer.parseInt(args[0]),这是比Scanner更“轻量”的输入方式。

Q3:如何让控制台程序“暂停”等待用户回车?

使用System.in.read()会等待一个字节,但容易吞掉换行。优雅解法sc.nextLine()

Q4:控制台输出彩色文字(如红色错误)?

使用ANSI转义序列:System.out.println("\u001B[31m错误\u001B[0m"),Windows CMD需先运行reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1

Q5:如何让程序在最后等待用户“按任意键退出”?

单线程中new java.util.Scanner(System.in).nextLine()即可阻塞,若需要无回显,则用上述Console方法。

上一篇Picocli案例

下一篇Groovy脚本案例

抱歉,评论功能暂时关闭!