「Java基本语法」标准输入和输出

引言

试想一下说话的场景,需要要听懂别人说的话(输入),也要能表达自己的想法(输出)。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

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容