导入包
java.util.Scanner
创建Scanner对象的基本语法:
Scanner s = new Scanner(System.in);
next()、nextInt()与nextLine()区别
next()
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next()不能得到带有空格的字符串
通过Scanner类的next()方法获取输入的字符串
在读取之前一般需要使用hasNext与hasNextLine判断是否还有输入的数据:
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//从键盘接收数据
//next方式接收字符串
System.out.println("next方式接收");
//判断是否还有输入
if(scan.hasNext()) {
String str1 = scan.next();
System.out.println("输入的数据为:"+str1);
}
scan.close();
}
}
输出结果:
可以看到com字符串并未输出
nextLine()
- nextLine()以回车键作为结束标志,读取方式是读取包括回车在内前面所有队列中的字符,向控制台返回的时候,会自动舍弃回车符,将输入的各个字符组成字符串输出,同时队列将会清空包含回车符
- 可以获得空白
import java.util.Scanner;
public class ScannerDemo2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//从键盘接收数据
//nextLine方式接收字符串
System.out.println("nextLine方式接收:");
//判断是否还有输入
if(scan.hasNextLine()) {
String str2 = scan.nextLine();
System.out.println("输入的数据为:"+str2);
}
scan.close();
}
}
输入结果:
可以看到com字符串输出
nextInt()
nextInt()以回车符作为输入结束标志
只读取回车符前面输入的所有内容,所以返回的时候它会将回车符前面内容返回并且清空回车符前的队列内容,将回车符留在队列中。
nextInt()与nextLine()同时使用
nextLine()在前面时:
import java.util.Scanner;
public class NextIntAndNextLine {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String l = sc.nextLine();
System.out.println("l:"+l);
int n = sc.nextInt();
System.out.println("n:"+n);
}
}
输出结果:
在后面时:
import java.util.Scanner;
public class NextIntAndNextLine {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println("n:"+n);
String l = sc.nextLine();
System.out.println("l:"+l);
}
}
输出结果
sc.nextLine()被自动跳过,所以l没有值。
原因:
nextInt()方法返回值的时候只清空回车符以前的数据,因此回车符被继续留在队列中继续向下执行,而nextLine()读取队列会将回车符读取,因此程序直接执行完毕。
解决办法
- 将nextLine()用next()替换
- 在nextLine()执行之前再加一个空的nextLine(),让这个空的清除掉回车符再向下执行
- nextInt()用nextLine()替换,最后进行类型转换
int n = Integer.parseInt(sc.nextLine());