引言
试想一下说话的场景,需要要听懂别人说的话(输入),也要能表达自己的想法(输出)。Java程序也需要这样的"对话能力",这就是标准输入输出。
标准输出 - 程序的"说话"方式
System.ou
t就像程序的嘴巴,负责把信息"说"给出来。它有三种常用的说话方式,就像我们说话有不同的语气。
1. println:说完话换行
# 源文件保存为“Greeting.java”。
public class Greeting {
public static void main(String[] args) {
System.out.println("早上好!");
System.out.println("今天天气真不错");
}
}
运行结果
早上好! 今天天气真不错!
println
这就像正常的对话,说完一句就换行。输出结果会是两行文字,清晰易读。
2. print:说话不换行
# 源文件保存为“Calculator.java”。
public class Calculator {
public static void main(String[] args) {
int a = 5, b = 3;
System.out.print(a + " + " + b + " = ");
System.out.println(a + b);
}
}
运行结果
5 + 3 = 8
print
就像把几句话说在一起,适合需要拼接的输出。这段代码会输出"5 + 3 = 8",等号前后的话连在一起。
3. printf:格式化说话
# 源文件保存为“Temperature.java”。
public class Temperature {
public static void main(String[] args) {
double temp = 23.4567;
System.out.printf("当前温度:%.2f摄氏度\n", temp);
System.out.printf("时间:%02d:%02d", 9, 5);
}
}
运行结果
当前温度:23.46摄氏度 时间:09:05
printf
就像用模板说话,可以精确控制格式。"%.2f"
表示保留两位小数,"%02d"
表示两位数不足补零。输出会是"当前温度:23.46摄氏度"和"时间:09:05"。
标准输入 - 程序的"耳朵"
Scanner
就好比程序的耳朵,用来"听"要输入的内容。使用前需要先"戴上耳朵"——导入java.util.Scanner
包。
基础输入案例
# 源文件保存为“AgeChecker.java”。
import java.util.Scanner;
public class AgeChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
if (age >= 18) {
System.out.println("你已成年");
} else {
System.out.println("你还是未成年人");
}
scanner.close(); // 用完要摘下耳朵
}
}
运行结果
请输入你的年龄:18 你已成年
这段代码会等待用户输入年龄,然后做出判断。注意最后要关闭Scanner
,就像用完耳朵要摘下来一样。
混合输入
# 源文件保存为“PersonInfo.java”。
import java.util.Scanner;
public class PersonInfo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的信息:");
System.out.print("姓名:");
String name = scanner.nextLine();
System.out.print("年龄:");
int age = scanner.nextInt();
scanner.nextLine(); // 清除缓冲区
System.out.print("职业:");
String job = scanner.nextLine();
System.out.printf("\n%s,%d岁,职业是%s", name, age, job);
scanner.close();
}
}
运行结果
请输入你的信息: 姓名:张三 年龄:18 职业:学生
张三,18岁,职业是学生
这里有个关键点:在使用nextInt()
后要用使用nextLine()
清除缓冲区。就好像接电话时,听完一个信息要"嗯"一声确认,才能听下一个信息。
常见错误及解决方法
-
Scanner忘记关闭:就像戴着耳机睡觉,虽然程序能运行,但资源没释放。解决方法是在使用完毕后调用
scanner.close()
。 -
输入类型不匹配:比如要求输入数字却输入了文字。这会引发InputMismatchException异常。解决方法是用hasNextInt()等方法先检查:
if (scanner.hasNextInt()) { int num = scanner.nextInt(); } else { System.out.println("请输入数字!"); }
-
nextLine跳过输入:混合使用
nextXXX()
和nextLine()
时经常出现。原因是nextXXX()
不会读取行尾的换行符。解决方法是在nextXXX()
后加一个scanner.nextLine()
清空缓冲区。 -
格式化字符串错误:
printf
中使用错误的格式符会导致IllegalFormatConversionException
。比如用%d输出浮点数。解决方法要确保格式符与数据类型匹配。
练习题
理论练习题
-
下面代码的输出结果是什么?
System.out.print("Hello"); System.out.println("World"); System.out.print("Java");
答案:
HelloWorld Java
解析:
print
不换行,println
换行,因此前两句的输出连在一起,第三句输出时另起一行。 -
为什么有时候nextLine()会直接跳过不等待输入?如何解决? 答案:因为前面使用了
nextInt()
等没有读取行尾换行符。解决方法是在nextInt()
等后加一个scanner.nextLine()
清空缓冲区。 -
如果想要输出一个保留3位小数的浮点数,应该使用什么格式字符串? 答案:
"%.3f"
。格式化字符串从百分号开始,f表示浮点数,.3表示三位小数。 -
如果用户在执行nextInt()时输入了字母,会发生什么?程序会如何表现? 答案:程序会抛出
InputMismatchException
异常并终止。就像问别人年龄,对方却回答"苹果"一样让人困惑。解决方法是用hasNextInt()
先做检查,或者用nextLine()
读取整行再用Integer.parseInt()
转换。 -
下面两段代码的输出有什么不同?为什么?
// 代码A System.out.print("温度:"); System.out.println(36.5); // 代码B System.out.printf("温度:%.1f\n", 36.5);
答案:输出看起来相同,都是"温度:36.5"。但代码B使用了格式化输出,能精确控制小数位数。就像手写数字和用印章盖章的区别,后者更加规范统一。
实操练习题
-
BMI计算器: 编写程序输入身高(m)和体重(kg),计算并输出BMI值(体重/身高²),保留2位小数。
# 源文件保存为“BMICalculator.java”。 import java.util.Scanner; public class BMICalculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入身高(米):"); double height = scanner.nextDouble(); System.out.print("请输入体重(公斤):"); double weight = scanner.nextDouble(); double bmi = weight / (height * height); System.out.printf("你的BMI值是:%.2f", bmi); scanner.close(); } }
运行结果
请输入身高(米):1.7 请输入体重(公斤):75 你的BMI值是:25.95
-
购物小票打印: 编写程序输入商品名称、单价和数量,输出格式化的购物小票。
# 源文件保存为“ReceiptPrinter.java”。 import java.util.Scanner; public class ReceiptPrinter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("商品名称:"); String name = scanner.nextLine(); System.out.print("单价:"); double price = scanner.nextDouble(); System.out.print("数量:"); int quantity = scanner.nextInt(); System.out.println("\n===== 购物小票 ====="); System.out.printf("%-10s\t单价\t数量\t总价\n", "商品名称"); System.out.printf("%-10s\t%.2f\t%d\t%.2f", name, price, quantity, price * quantity); scanner.close(); } }
运行结果
商品名称:洗发水 单价:20.8 数量:2
===== 购物小票 ===== 商品名称 单价 数量 总价 洗发水 20.80 2 41.60
-
用户注册验证: 编写程序要求用户输入用户名和密码,密码需要输入两次进行验证。
# 源文件保存为“Registration.java”。 import java.util.Scanner; public class Registration { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("设置用户名:"); String username = scanner.nextLine(); System.out.print("设置密码:"); String password1 = scanner.nextLine(); System.out.print("再次输入密码:"); String password2 = scanner.nextLine(); if (password1.equals(password2)) { System.out.println("注册成功!"); System.out.println("用户名:" + username); } else { System.out.println("两次密码不一致!"); } scanner.close(); } }
运行结果
设置用户名:admin 设置密码:admin 再次输入密码:admin 注册成功! 用户名:admin
-
天气预报播报器: 编写程序输入城市名称、当前温度和天气状况,生成格式化的天气预报。
# 源文件保存为“WeatherReport.java”。 import java.util.Scanner; public class WeatherReport { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("城市:"); String city = scanner.nextLine(); System.out.print("当前温度(℃):"); double temp = scanner.nextDouble(); scanner.nextLine(); // 清除换行符 System.out.print("天气状况(晴/雨/阴/雪):"); String condition = scanner.nextLine(); System.out.println("\n====== 天气预报 ======"); System.out.printf("%s市今日天气:%s\n", city, condition); System.out.printf("当前气温:%.1f℃\n", temp); System.out.println("====== ====== ======"); scanner.close(); } }
运行结果
城市:三亚 当前温度(℃):37.6 天气状况(晴/雨/阴/雪):晴
====== 天气预报 ====== 三亚市今日天气:晴 当前气温:37.6℃ ====== ====== ======
-
图书信息管理系统: 编写程序输入图书信息,包括书名、作者、价格和库存量,然后以表格形式输出。
# 源文件保存为“BookManagement.java”。 import java.util.Scanner; public class BookManagement { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("书名:"); String title = scanner.nextLine(); System.out.print("作者:"); String author = scanner.nextLine(); System.out.print("价格:"); double price = scanner.nextDouble(); System.out.print("库存量:"); int stock = scanner.nextInt(); System.out.println("\n====== 图书信息 ======"); System.out.printf("%-20s%-15s%-10s%-8s\n", "书名", "作者", "价格", "库存"); System.out.printf("%-20s%-15s¥%-9.2f%-8d", title, author, price, stock); scanner.close(); } }
运行结果
书名:好诗不厌百回读 作者:袁行霈 价格:38 库存量:5
====== 图书信息 ====== 书名 作者 价格 库存
好诗不厌百回读 袁行霈 ¥38.00 5