java的Scanner类的hasNext()方法问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的Scanner类的hasNext()方法问题相关的知识,希望对你有一定的参考价值。

Scanner sc = new Scanner(System.in);

while(sc.hasNext())
System.out.println(sc.next());


命令行运行不会停止,你可以一直输入数据,不会自动结束,意思就是你跳不出这个循环了,为什么求指导???

hasNext()这个方法是如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。所以循环会一直下去。
你可以设置一个终止符,调用hasNext()的重载方法hasNext(String patten):如果下一个标记与从指定字符串构造的模式匹配,则返回 true。扫描器不执行任何输入。
例:以输入"0",结束输出
Scanner sc = new Scanner(System.in);
while (!sc.hasNext("0"))
System.out.println(sc.next());

仅做参考!
参考技术A 你可以试着把sc.hasNext()打印出来看看
随便输入个字符 结果是true 因为hasNext()是获取字符的
while循环的条件是true
它当然就是死循环 跳不出去了
如果你换成hasNextInt()
输入不是Int类型的东西他就为false
那么循环可以退出
反之输入的是Int为true 他也会一直执行
直到flase为止
参考技术B Scanner sc = new Scanner(System.in);

此句 表示从控制台获取数据,
sc.hasNext() 表示你是否有输入数据,
while语句块 表示当你输入数据的时候,就执行输出sc.next()(输出内容)
所以只要你输入数据了,它就可以执行,
所以后台只是开了一块内存,一直未关闭,不算死循环
参考技术C

我记得以前好像可以直接回车跳出,但是现在突然发现了,掉坑。。。

while (scanner.hasNextLine()) 
    String string = (String) scanner.nextLine();
    if (string.equals("")) 
        break;
    

这样就可以了,注意equals不能换成等号,因为等号比的是值(数值或地址值),而“”比较的其实是两个不同字符对象的内容而不是值。

参考技术D 炼金00000000000000000

Java流程控制

Java 流程控制

1、用户交互Scanner

  • java.util.Scanner 是 java5 的新特征,我们可以通过Scanner类来获取用户的输入。

  • 基本语法

    Scanner s = new Scanner(System.in);
    
  • 通过Scanner 类的next() 与nextLine() 方法获取输入的字符串,在读取前我们一般需要用 hasNext() 与 hasNextLine() 判断是否还有输入的数据

  • 用完Scanner (IO流),记得用 .close()关掉 ,节省一些资源,如果不关闭,会一直占用资源

Scanner 对象

  • next(): (接收字符串) ---- hasNext()

    1. 一定要读取到有效字符后才可以结束输入
    2. 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉(有效字符前的空格忽略)
    3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符(有效字符后的空格为结束符)
    4. next() 不能得到带有空格的字符串
  • nextLine(): (接收字符串) ---hasNextLine()

    1. 以Enter 为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符

    2. 可以获得空白

  • nextInt():(接收整数) ---- hasNextInt()

  • nextFloat() : (接收小数) ----hasNextFloat()

  • 等等类似的方法

//练习
public static void main(String[] args) { 
        //输入多个数字, 并求其总和与平均数,每输入一个数字用回车确认,
        // 通过输入非数字来结束输入并输出执行结果
        Scanner scanner = new Scanner(System.in);
        double sum = 0;
        int acccout = 0;
        double average = 0;
        while(scanner.hasNextDouble()){
            double i = scanner.nextDouble();
            sum+=i;
            acccout++;
        }
        average = sum / acccout;
        System.out.println("总和为"+sum +"  "+"平均为" + average);
        scanner.close();
    }

2、顺序结构

  • java 的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行
  • 顺序结构是最简单的算法结构
  • 语句与语句之间,框与框之间是按从上到下的顺序进行的。它是有若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种算法结构

3、选择结构

  • if单选择结构

  • if双选择结构

  • if多选择结构

  • 嵌套的if结构

  • switch多选择结构

    switch语句中的变量类型可以是:

    1. byte、short 、int 或char
    2. 从Java SE 7开始,switch 支持字符串String 类型了,同时case 标签必须为字符串常量或字面量
    3. 字符的本质还是数字,实质还是用数字判断
//源程序
package com.liuchengkongzhi;

import java.util.Scanner;

public class Demo1 {


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        switch (name){
            case "li":
                System.out.println("li");break;
            case "hello":
                System.out.println("hello");break;
            default:
                System.out.println("end");
        }
        scanner.close();
    }

}

//反编译的字节码文件

package com.liuchengkongzhi;

import java.util.Scanner;

public class Demo1 {
    public Demo1() {
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        byte var4 = -1;
        switch(name.hashCode()) {
        case 3453:
            if (name.equals("li")) {
                var4 = 0;
            }
            break;
        case 99162322:
            if (name.equals("hello")) {
                var4 = 1;
            }
        }

        switch(var4) {
        case 0:
            System.out.println("li");
            break;
        case 1:
            System.out.println("hello");
            break;
        default:
            System.out.println("end");
        }

        scanner.close();
    }
}

从中可以看出,switch 支持字符串,实际上还是用数字判断,用到是对象的哈希值,所以,字符,数字,字符串。switch 实质还是用数字判断

利用Idea查看反编译的字节码(.class)文件

  1. File -> Project Structure(项目结构) ,复制该项目的地址
  2. 在电脑中找到对应位置,找到项目下相应程序的字节码文件
  3. 对应程序右键 -> show in Explorer
  4. 将刚的对应的.class文件复制到该目录
  5. 回到idea,发现出现对应的.class文件(反编译的字节码文件) ,打开查看

?

4、循环结构

  • while 循环
    1. 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环
    2. 少部分情况需要循环一直执行,比如服务器的请求响应监听等
  • do ... while循环
    1. do... while 循环和 while 循环相似,不同的是,do...while 循环至少会执行一次
    2. while 先判断后执行,do while是先执行后判断
  • for 循环
    1. for 循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
    2. for 循环执行的次数是在执行前就确定的
    3. 最先执行初始化步骤,可以声明一种类型,可初始化一个或多个循环控制变量。也可以是空语句。然后,检测布尔表达式的值,如果为true,循环体被执行。如果为false ,循环终止。开始执行循环体后面的语句。执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。再次检测布尔表达式。循环执行上面的过程
  • 用于数组或集合的增强型for循环(foreach)

5、break & continue

  • break 在任何循环语句的主体部分,均可用break 控制循环的流程。break用于强行退出循环,不的循环中剩余的语句(break语句也在switch语句中使用)
  • continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
  • 关于goto关键字
    1. goto 关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;然而,在break和continue 这两个关键字的身上,我们仍然能看出一些goto的影子----带标签的break和continue
    2. 标签是指后面跟一个冒号的标识符,例如:label:
    3. 对 java 来说 唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break 和continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方
//标签的简单写法
   public static void main(String[] args) {
        int count = 0;
        outer:
        for(int i=101;i<150;i++){
            for(int j=2;j<i/2;j++){
                if(i % j == 0){
                    continue outer;
                }

            }
            System.out.println(i);
        }
    }

6、练习

  1. 计算 0 到 100 之间的奇数和偶数的和
  2. 用while 或for 循环输出1-1000之间能被5 整除的数,并且每行输出3个
  3. 打印九九乘法表
  4. 打印三角形
//快捷键  5.for +Enter 生成
//快捷键   fori  
 for (int i = 0; i < 5; i++) {

        }
 //6.fori + enter
        for (int i = 0; i < 6; i++) {
            
        }
// 5.forr + enter
        for (int i = 5; i > 0; i--) {
            
        }
//num.fori :从 0 到 num-1
//num.forr :从 num-1 到 0
//打印三角形
    public static void main(String[] args) {

        for (int i = 0; i <= 5; i++) {
            for (int j = 5; j >=i ; j--) {
                System.out.print(" ");
            }
            for (int j = 0; j < i ; j++) {
                System.out.print("*");
            }
            for (int j = 1; j <i ; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

 }
     *
    ***
   *****
  *******
 *********

以上是关于java的Scanner类的hasNext()方法问题的主要内容,如果未能解决你的问题,请参考以下文章

Java Scanner的hasNext()方法

Java Scanner类hasNext()方法BUG

java - 如何使用Scanner方法“hasNext”作为条件退出java中的while循环?

Java Scanner hasNext(String) 方法有时不匹配

Java Scanner 类

Java Scanner 类