Java基础——Java的输入(Scanner对象的使用)

前言

Java的输入是比较麻烦的,而且存在一些"bug"
因为Java本来就不是用来开发控制台程序的,主要是后台开发
因为有时候是在前台传数据传到后台
所以其实很少读入数据

读入一个字符

System.int.read()可以读入一个字符,但是需要搭配异常处理
并且需要导入包

import java.io.IOException;//在最开头导入IOException包
//                                     这里需要抛出一个异常
public static void main(String[] args) throws IOException {
        System.out.print("Enter a char:");
        char i=(char)System.in.read();
        System.out.print("Your char is:"+i);
    }

构造Scanner对象,与标准输入流 System.in 关联

我们经常利用Scanner对象来读入数据
不过Scanner的使用 也需要导入包
在最开头导入包:import java.util.Scanner

代码:

Scanner scanner = new Scanner(System.in);// 这样就构造了一个Scanner对象
//并且与System.in相关联

理解:

构造的对象的名字叫 scanner
scanner就像一个流,里面存放了你输入键盘的内容
流中还有东西 就不会让你输入,会把流中的东西读走
注意:scanner其实是一种资源,使用完毕 最好关闭:scanner.close()
就像C中的文件关闭fclose()

读入整数

已经构建好Scanner对象:scanner
scanner.nextInt–>读入一个整数
nextInt就是把流中的内容转化为int 如果不能转 那么就报错

public static void main2(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x=scanner.nextInt(); // 读入整数 用x接受
        System.out.println(x);  //输出整数
        //使用完毕之后 关闭scanner
        scanner.close();
    }

其他的读入类似
重点看一下读入字符串

读入字符串

读入字符串有两种方式:

  1. scanner.next()
  2. scanner.nextLine()

区别:

  • nextLine()表示读入一行,包括空格
  • next()遇到空格就会结束 空格后面的留在缓冲区会被 下一次的读取给读走
    当然做OJ的时候不用考虑这个问题,人家后台会给你处理好

使用next()的常见“坑”

  1. 如果我们使用scanner.next()读入“hello world”,由于next()遇到空格结束,因此此时缓冲区还存在你输入的 “world” 未被读走,如果我们接下来使用scanner.nextInt()读取整数,并不会先让你输入,因为此时缓冲区还有内容"world",所以他会把"world" 进行nextInt的转换, 而字符串肯定是不能转为int的
    所以就会报错!
    在这里插入图片描述
    在这里插入图片描述

所以我们一般使用的是 scanner.nextLine()

关于读整数和读字符串的先后顺序

如果我们 需要读取整数和字符串
一般先读字符串再读整数
为什么呢?
这也是Java输入的一个bug
先看例子:

  • 先读字符串,再读整数
    在这里插入图片描述
    在这里插入图片描述

分析:
因为nextLine()会读走换行符
其他的并不会
所以如果先读走整型,只是把可以转换成整型的数据都走了 剩下的呢?
–> 此时缓冲区还有\n没有读走,这时候 nextLine就会读走换行符 输出就啥也没有,之后向下走一行
而 如果先读字符串就不存在这个问题

所以原则:如果是读整数和字符串,那么就先读字符串

循环读取

hasNextInt()
---->存在下一个整数
类似的还有hasNextchar()

while(scanner.hasNextInt()){
			int n=scanner.nextInt();
			System.out.println(n);
		}

上面代码的意思就是 如果流中还有能转换成int类型的数据 那么进入循环

再IDEA中 按Ctrl + D 为停止
再OJ 中 这些不用管,题目要求输入n个整数 后台会帮我们处理的

hasNext()的坑

看这样一个代码
如果流中还有东西 就进入循环
但是:这种方法 只会判断流中是否还存在东西
有东西就进入循环
但是如果进入循环 数据无法被nextInt()转换 成int类型
就会报错
(不负责任的家伙)
在这里插入图片描述

如何避免?
还是使用hasNextInt()
直接在控制循环的条件位置 顺便检查了是否还有能够转化为想要的数据类型的内容
在这里插入图片描述
这里利用hasNextInt–>看下一个是否为整数,如果不是整数就不进入循环,不会报错

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021狮子歌歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值