Java中输入被跳过情况的深入探究

java新手,写学校作业时发现了这个问题

问题代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
            System.out.print("请输入: ");
            double a = reader.nextDouble();
            System.out.print("请输入: ");
            //这句话的输入被跳过了↓
            String s = reader.nextLine();
    }
}

运行时,发现第二个输入直接被跳过了

为了解决这个问题,我对Java中出现输入被跳过的情况进行了探究

先上结论

①Java中连续出现两个输入,部分情况下会出现第二个输入被跳过的情况

②输入被跳过的情况只会发生在出现nextLine()方法的情况下

③当nextLine();方法位于任意输入方法( nextXXX() )之后(不包括nextLine() )时,nextLine()方法会因为读取了回车而跳过输入

④简单的解决办法:把nextLine();换成next() 或者 写两个nextLine(),让第一个nextLine()吃掉回车

Ⅰ.两个数字的输入:

输入两个int类型的数据

		Scanner reader = new Scanner(System.in);
        System.out.print("输入数字: ");
        int a = reader.nextInt();
        System.out.print("输入数字: ");
        a = reader.nextInt();

运行结果

可以发现输入时没有任何问题。同理,double,float,Long,short,byte型数据,可以正常进行输入操作

Ⅱ.两个字符串的输入:

1.两个next();与两个nextLine();

		System.out.print("输入字符串: ");
        String s = reader.next();
        System.out.print("输入字符串: ");
        s = reader.next();

运行结果

输入也没有任何问题

2.先nextLine()后next();

			System.out.print("输入字符串: ");
            String s = reader.nextLine();
            System.out.print("输入字符串: ");
            s = reader.next();

运行结果同上,无问题

加入循环后

while(true){
            System.out.print("输入字符串: ");
            String s = reader.nextLine();
            System.out.print("输入字符串: ");
            s = reader.next();
        }

加入了循环之后,发现nextLine()的输入被跳过了

同时,我们发现,加入循环后,nextLine();的输入变成了在next()后,这可能是输入被跳过的原因

3.先next()后nextLine();

			System.out.print("输入字符串: ");
            String s = reader.next();
            System.out.print("输入字符串: ");
            s = reader.nextLine();

发现第二个输入直接被跳过了

Ⅲ.一个数字和一个字符串的输入

1.先数字后字符串

情况一:字符串输入用nextLine();

			System.out.print("输入数字: ");
            int a = reader.nextInt();
            System.out.print("输入字符串: ");
            String s = reader.nextLine();

发现第二个输入被跳过

得出结论:数字输入后不能接nextLine();输入

情况二:字符串输入用next();

			System.out.print("输入数字: ");
            int a = reader.nextInt();
            System.out.print("输入字符串: ");
            String s = reader.next();

2.先字符串后数字

情况一:字符串输入用nextLine();

可以正常输入

加入循环

while (true) {
        System.out.print("输入字符串: ");
        String s = reader.nextLine();
        System.out.print("输入数字: ");
        int a = reader.nextInt();
        }

运行结果:

发现加入循环后,和先nextLine()后next();的结果一样,nextLine();的输入被跳过了

推测是因为**加入循环后,nextLine();的输入变成了在next()后,**读取了前一个输入的回车,所以输入被跳过

情况二:字符串输入用next();

		System.out.print("输入字符串: ");
        String s = reader.next();
        System.out.print("输入数字: ");
        int a = reader.nextInt();

运行结果:

加入循环,同样可以正常输入

可以发现用next();输入字符串无论是在数字输入之前,或者数字输入之后,均无影响

while (true) {
        System.out.print("输入字符串: ");
        String s = reader.next();
        System.out.print("输入数字: ");
        int a = reader.nextInt();
        }

综上,发现当nextLine()方法位于任意输入之后,nextLine()会读取前一个输入的回车,造成nextLine()的输入被跳过的情况

而next()方法输入字符串则没有这种问题

注意:通过测试可知,"\n"并不会成为返回的字符,也就是说本来应该用nextLine()方法输入的字符串的内容是为空的,而不是"\n";

总结

到此这篇关于Java中输入被跳过情况的文章就介绍到这了,更多相关Java输入被跳过内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中输入被跳过情况的深入探究

    java新手,写学校作业时发现了这个问题 问题代码 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner reader = new Scanner(System.in); System.out.print("请输入: "); double a = reader.nextDouble(); System.out.print("请输入: &quo

  • 浅谈JAVA中输入输出流实例详解

    java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家介绍JAVA中输入输出流实例详解. 流的层次结构 定义:        java将读取数据对象成为输入流,能向其写入的对象叫输出流.结构图如下: 1.输入输出: 输入/输出(Input/Output)是指对某

  • Java中输入与输出的方法总结

    目录 输入方法 第一种输入方法:scanner 第二种输入方法:JOptionPane 第三种输入方法:io.Console 输出方法 第一种输出方法:System.out.print() 第二种输出方法:System.out.println() 第三种输出方法:System.out.printf() 输入方法 第一种输入方法:scanner import java.util.Scanner; // 导入java.util.Scanner public class User {     publ

  • Java 中ConcurrentHashMap的实现

    ConcurrentHashMap(简称CHM)是在Java 1.5作为Hashtable的替代选择新引入的,是concurrent包的重要成员.在Java 1.5之前,如果想要实现一个可以在多线程和并发的程序中安全使用的Map,只能在HashTable和synchronized Map中选择,因为HashMap并不是线程安全的.但再引入了CHM之后,我们有了更好的选择.CHM不但是线程安全的,而且比HashTable和synchronizedMap的性能要好.相对于HashTable和sync

  • Java中io流解析及代码实例

    IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的:常用的文件读取用的就是字符流,在网络通信里面用的就是字节流 下面这张图是Java中IO流的总体框架: 字节流 Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract) 常用的字节流有: 1.FileInp

  • 详解java中产生死锁的原因及如何避免

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了.导致了死锁.这是最容易理解也是最简单的死锁的形式.但是实际环境中的死锁往往比这个复杂的多.可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁L1并且申请获得锁L2,而线程T2持有锁L2并且申请获得锁L3,而线程T3持有锁L3并且申请获得锁L1,这样导致了一个锁依赖的环路:T1依

  • 深入了解为什么Java中只有值传递?

    1.为什么 Java 中只有值传递? 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值. 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式. Java程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,也就

  • 浅谈从Java中的栈和堆,进而衍生到值传递

    简述Java中的栈和堆,变量和对象的地址存放和绑定机制 初学java的小白,很多人都搞不清楚java中堆和栈的概念,我们都知道计算机只能识别二进制字节码文件,如果分不清楚对象和变量在内存的地址分配,也就是堆和栈的问题,很多问题比如绑定机制.静态方法.实例方法.局部变量的作用域就会搞不清楚. 首先记住结论: 基本数据类型.局部变量.String类型的直接赋值都是存放在栈内存中的,用完就消失. new创建的实例化对象.String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃

  • 图文详解Java中的字节输入与输出流

    目录 字节输入流 字节输入流结构图 FileInputStream类 构造方法: 常用读取方法: 字节输出流 字节输出流结构图: FileOutputStream类 构造方法: 常用写入方法: 总结 字节输入流 java.io.InputStream抽象类是所有字节输入流的超类,将数据从文件中读取出来. 字节输入流结构图 在Java中针对文件的读写操作有一些流,其中介绍最常见的字节输入流. FileInputStream类 FileInputStream流被称为字节输入流,对文件以字节的形式读取

  • java中的空指针异常情况以及解决方案

    目录 概述 问题描述 第一种 第二种 第三种 问题定位 Java空指针异常的若干解决方案 存在NullPointerException的安全方法 如何避免 java空指针异常:java.lang.NullPointException 一.什么是java空指针异常 二.如何解决 概述 出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常. 问题描述 第一种 out.println(request.getParameter("username")); 如果request里面并没有us

随机推荐