学习笔记,仅供参考


文章目录

  • Scanner类
  • Scanner获取数据出现的问题

Scanner类

  • 概述

Scanner是在java.util包下的一个类,使用该类时我们需要导包。这个类被final修饰,也就是说,它是最终类,不能被继承。它是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。

  • 举个例子
package com.guiyang.restudy3;import java.util.Scanner;public class D1Scanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个整数:");int x  = scanner.nextInt();System.out.println("x = " + x);}}

输出:

请输入一个整数:
10
x = 10

如果这时,我们输入字符a,则会报错:

请输入一个整数:
a
Exception in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Unknown Source)at java.util.Scanner.next(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at com.guiyang.restudy3.D1Scanner.main(D1Scanner.java:10)

如果我希望录入的只有int类型的数值,那么我们该怎么办呢?

这时,我们可以使用hasNextInt()方法, 该方法会判断键盘录入的数值是否为int类型,如果是则返回true,不是则返回false

下面我们应用该方法:

package com.guiyang.object;import java.util.Scanner;public class Demo1_Scanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个整数:");if (scanner.hasNextInt()) {int x = scanner.nextInt();System.out.println("x = " + x);} else {System.out.println("输入错误.");}}}

输出:

请输入一个整数:
a
输入错误.
  • 一般方法

    • hasNextXxx():可以判断是否还有下一个输入项,其中Xxx可以是Int,Double等类型,如果需要判断下一个输入项是否为字符串,Xxx可以省略;
    • nextXxx():可以获取下一个输入项,其中Xxx和hasNextXxx()中的Xxx意义相同,默认情况下,Scanner使用空格和回车作为分隔符。

Scanner获取数据出现的问题

  • 常用的两个方法

    • nextInt():获取一个int类型的值
    • nextLine():获取一个String类型的值
  • 举个例子1

获取分别多个int值和多个String值。

获取多个int值:

package com.guiyang.restudy3;import java.util.Scanner;public class D1Scanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第1个整数:");int x1  = scanner.nextInt();System.out.println("x1 = " + x1);System.out.println("请输入第2个整数:");int x2  = scanner.nextInt();System.out.println("x2 = " + x2);}}

输出:

请输入第1个整数:
10
x1 = 10
请输入第2个整数:
20
x2 = 20

获取多个字符串:

package com.guiyang.restudy3;import java.util.Scanner;public class D1Scanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第1个字符串:");String x1  = scanner.nextLine();System.out.println("请输入第2个字符串:");String x2  = scanner.nextLine();System.out.println("x1 = " + x1 + ", x2 = " + x2);}
}

输出:

请输入第1个字符串:
Huang
请输入第2个字符串:
9
x1 = Huang, x2 = 9
  • 举个例子2(nextInt()和nextLine()一起用时出现的小问题)

我们知道nextInt()是录入整数的方法,当我们录入一个整数(比如10)再敲回车的时候,其实在键盘上录入的是10\r\n,而nextInt()方法只获取到10就结束了,如果此时我们立马用nextLine()方法获取字符串,那么nextLine()方法就会遇到nextInt()方法未获取的\r\nnextLine()方法只要一遇到\r\n就会结束方法,不再获取。

我们看下面一段代码,验证我们刚刚说的段话:

package com.guiyang.restudy3;import java.util.Scanner;public class D1Scanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第1个整数:");int x1 = scanner.nextInt();System.out.println("请输入第2个字符串:");String x2  = scanner.nextLine();System.out.println("x1 = " + x1 + ", x2 = " + x2);}
}

输出:

请输入第1个整数:
10
请输入第2个字符串:
x1 = 10, x2 =

当我们录入10再敲回车后,JAVA没有给我们输入字符串的机会,直接结束。

那么对于这种问题有没有什么解决办法呢?

解决方案1:创建两个键盘录入对象即可:

package com.guiyang.restudy3;import java.util.Scanner;public class D1Scanner {public static void main(String[] args) {Scanner scanner1 = new Scanner(System.in);System.out.println("请输入第1个整数:");int x1 = scanner1.nextInt();Scanner scanner2 = new Scanner(System.in);System.out.println("请输入第2个字符串:");String x2  = scanner2.nextLine();System.out.println("x1 = " + x1 + ", x2 = " + x2);}
}

输出:

请输入第1个整数:
10
请输入第2个字符串:
Huang
x1 = 10, x2 = Huang

虽然这样解决了我们的燃眉之急,但是创建2个对象会浪费内存空间,所以不支持。

解决方案2:2次都录入字符串,都用nextLine()方法,再将整数字符串转换为整数。这里我们就不做演示了,等学到相关方法时,回头解决这个问题。

第三次学JAVA再学不好就吃翔(part46)--Scanner类相关推荐

  1. 第三次学JAVA再学不好就吃翔(part107)--字符流的拷贝

    学习笔记,仅供参考,有错必纠 文章目录 IO流 字符流的拷贝 拷贝纯文本文件 注意事项 自定义字符数组的拷贝 IO流 字符流的拷贝 拷贝纯文本文件 zzz.txt: 安徽财经大学 JAVA代码: pa ...

  2. 第三次学JAVA再学不好就吃翔(part40)--import关键字

    学习笔记,仅供参考 面向对象 import关键字 为什么要有import 让有包的类对调用者可见,并且不用写全类名 导包格式 import 包名; 举个例子 我们先用不导包的方式进行键盘录入: cla ...

  3. 第三次学JAVA再学不好就吃翔(part106)--字符流

    学习笔记,仅供参考,有错必纠 文章目录 IO流 字符流输入流FileReader 字符流是什么 FileReader类构造方法 举个例子 字符流输出流FileWriter FileWriter构造方法 ...

  4. 第三次学JAVA再学不好就吃翔(part117)--单例设计模式

    学习笔记,仅供参考,有错必纠 文章目录 多线程 单例设计模式 饿汉式 懒汉式 第三种格式 Timer类 线程的五种状态 多线程 单例设计模式 单例设计模式,即保证类在内存中只有一个对象,如何保证类在内 ...

  5. 第三次学JAVA再学不好就吃翔(part109)--LineNumberReader类

    学习笔记,仅供参考,有错必纠 IO流 LineNumberReader类 该类继承自java.io.BufferedReader,该类可以跟踪行号的缓冲字符输入流.此类定义了方法 setLineNum ...

  6. 第三次学JAVA再学不好就吃翔(part108)--带缓冲的字符流

    学习笔记,仅供参考,有错必纠 文章目录 IO流 带缓冲的字符流 BufferedReader和BufferedWriter readLine和newLine方法 IO流 带缓冲的字符流 Buffere ...

  7. 第三次学JAVA再学不好就吃翔(part7)--基础语法之运算符

    学习笔记,仅供参考 文章目录 JAVA基础语法 运算符 算数运算符 算术运算符 ++和-- 赋值运算符 关系运算符 JAVA基础语法 运算符 什么是运算符 就是对常量和变量进行操作的符号. 运算符的分 ...

  8. 第三次学JAVA再学不好就吃翔(part115)--多线程

    学习笔记,仅供参考,有错必纠 文章目录 多线程 多线程引入 什么是线程 多线程并行和并发的区别 Java程序运行原理 多线程的实现方式 多线程实现的方式1 多线程程序实现的方式2 以上两种实现方式的区 ...

  9. 第三次学JAVA再学不好就吃翔(part113)--对象操作流

    学习笔记,仅供参考,有错必纠 对象操作流 对象操作流可以将一个对象写出, 或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作. 举个例子 先构造一个Role类: package com.gu ...

最新文章

  1. 无需重启, 使用Xephyr调试awesome
  2. 马云不会因支付宝事件走下神坛
  3. pycharm的演示模式、无干扰模式、全屏模式(presentation mode、distraction free mode、full screen mode)
  4. 参会全攻略 | 倒计时 7 天!30+ 位重量级嘉宾“聊”什么?
  5. React Native 实现FlatList的下拉刷新上拉加载
  6. 《Android应用开发攻略》——2.2 异常处理
  7. 简述计算机文件的命名办法,如何进行文件命名-如何进行文件管理
  8. Keras同时用多张显卡训练网络
  9. 深入dos编程_编程入门先要学什么?打怪升级走起来!
  10. Oracle10g数据库在AIX 5.3上的安装
  11. ZOJ3953 Intervals
  12. 信息安全工程师考试心得体会
  13. Python 学习单词记忆
  14. iOS实现炫酷悬停交互视图
  15. 计算机经常自动关机怎么回事,教你电脑总是自动关机怎么办
  16. 计算机需要权限来执行此操作 win7,Win7系统下“文件夹访问被拒绝 您需要权限来执行操作”解决方法...
  17. 大白菜 装系统 win7
  18. 《痞子衡嵌入式半月刊》 第 21 期
  19. 转载 :make报错:/usr/bin/ld: cannot find -lXXX
  20. 147. Python语言 的 Flask框架项目前导 之 Flask数据库 第三章 :SQLAlchemy-ORM 介绍

热门文章

  1. python3.5中pdfkit的详细配置与使用
  2. wpf调用其他项目界面_WPF开发Prism框架实现一个简单播放器
  3. Machine Learning之Python篇(二)
  4. docker容器内开启22 ssh_在docker容器中开启ssh服务 (未成功有时间再验证)
  5. 跟踪源码运行流程---SpringMVC学习笔记(四)
  6. SpaceEmacs Rock Day5 学习笔记
  7. 拆半查找的递归和非递归算法
  8. 《JavaScript应用程序设计》一一2.17 回调函数
  9. 单机搭建Android开发环境(五)
  10. Windows 7 完美安装 Visual C++ 6.0