引言
试想一下说话的场景,需要要听懂别人说的话(输入),也要能表达自己的想法(输出)。Java程序也需要这样的”对话能力”,这就是标准输入输出。
标准输出 – 程序的”说话”方式
System.out就像程序的嘴巴,负责把信息”说”给出来。它有三种常用的说话方式,就像我们说话有不同的语气。
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摄氏度
", 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("
%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
", 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("
===== 购物小票 =====");
System.out.printf("%-10s 单价 数量 总价
", "商品名称");
System.out.printf("%-10s %.2f %d %.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("
====== 天气预报 ======");
System.out.printf("%s市今日天气:%s
", city, condition);
System.out.printf("当前气温:%.1f℃
", 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("
====== 图书信息 ======");
System.out.printf("%-20s%-15s%-10s%-8s
", "书名", "作者", "价格", "库存");
System.out.printf("%-20s%-15s¥%-9.2f%-8d",
title, author, price, stock);
scanner.close();
}
}
运行结果
书名:好诗不厌百回读
作者:袁行霈
价格:38
库存量:5====== 图书信息 ======
书名 作者 价格 库存
好诗不厌百回读 袁行霈 ¥38.00 5

















暂无评论内容