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


    前言

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

    读入一个字符

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

    import java.io.IOException;//在最开头导入IOException包
    
    • 1
    //                                     这里需要抛出一个异常
    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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    代码:

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

    理解:

    构造的对象的名字叫 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    读入字符串

    读入字符串有两种方式:

    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);
    		}
    
    • 1
    • 2
    • 3
    • 4

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

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

    hasNext()的坑

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

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

  • 相关阅读:
    前端学习路线(二)
    哪款电容笔适用于ipad2017?Ipad2017推荐电容笔
    web前端大作业 (仿英雄联盟网站制作HTML+CSS+JavaScript) 学生dreamweaver网页设计作业
    npm install 报错ERESOLVE unable to resolve dependency tree
    uniapp 如何嵌套H5 页面?
    Spring底层原理学习笔记--第十一讲--(aop之proxy增强-jdk及aop之proxy增强-cglib)
    跨站脚本攻击xss攻击
    SAP BASIS SET_PARAMETER_ID_TOO_LONG
    DSPE-PEG-Silane,DSPE-PEG-SIL,磷脂-聚乙二醇-硅烷修饰二氧化硅颗粒用
    模拟版图设计工程师要学些什么?从入门到入行,你想知道的都在这里了
  • 原文地址:https://blog.csdn.net/K_04_10/article/details/125405899