目录
问题1: Scanner中的 nextInt() 后面不能直接跟 nextLine();
数组扩容代码:
import java.util.Scanner;
public class test {
public static void main(String[] args) {
int[] a = { 1, 2, 3 };
Scanner myScanner = new Scanner(System.in);
do {
int[] newa = new int[a.length + 1];
for (int i = 0; i < a.length; i++) {
newa[i] = a[i];
}
int addnum = Integer.parseInt(myScanner.next());
//int addnum = myScanner.nextInt();
newa[a.length] = addnum;
a = newa;
System.out.printf("a扩容后的元素情况:\n");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println("是否继续扩容(y/n)");
char key = myScanner.next().charAt(0);
if (key == 'N' || key == 'n') {
break;
}
} while (true);
System.out.println("数组扩容完毕");
// 扩容之后数组遍历
System.out.print("[");
for (int i = 0; i < a.length; i++) {
if (i == a.length - 1) {
System.out.print(a[a.length - 1] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
}
问题1: Scanner中的 nextInt() 后面不能直接跟 nextLine();
nextLine()并未读取任何输入,直接转到了下一行。
问题分析(缓冲区问题):
nextLine()会把 nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下一条语句执行。
————————————————
原文链接:https://blog.csdn.net/gg543012991/article/details/52900592
问题2:next 与 nextLine 的区别
next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。
nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
next()在输入有效字符之后,将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
注意:在有效字符前的空格,Tab键,Enter键等不被next读取,从输入第一个有效字符后的空格,Tab键,Enter键等才会被视为结束符。(包括分隔的空格都会保留在缓存区域)
nextLine()方法的结束符只是Enter键
nextLine则不管是否读取到有效字符,只要输入Enter即结束(就算直接输入Enter也是直接结束)
总结:
Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等。
next()方法读取到空白符就结束l;
nextLine()读取到回车结束也就是“\r”;
所以没还顺序前测试的时候next()再检测到空格的时候就结束输出了。
修改顺序后遇到的问题是因为next()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,不输出不代表没数据,是接到了空(回车“/r”)的数据。
————————————————
参考资料:https://blog.csdn.net/superme_yong/article/details/80543995
数组扩容里若两个输入修改为 next 和 nextLine 报错的原因
next:输入6+Enter(\n)
报错内容:
StringIndexOutOfBoundsException: String index out of range: 0
可能原因:
next输入有效字符后直接接回车会将回车(\n)以及后面的内容留在缓存区里,
nextLine读取到回车(\n)直接结束故报错
next:输入6+空格+回车(\n)
未报错(空格停止了对后面回车(\n)的录取?)X
nextLine:输入y
报错内容:
NumberFormatException: For input string: "y"(数字格式化异常)
原因:
数字格式化异常指输入的字符串String里必须是数字类型(由于Integer的强转引起)
说明输入的y是被nextLine读取而非next读取,nextLine读取到的应该是回车(\n)尝试不用回车(\n)只用空格但是仍会报错StringIndexOutOfBoundsException
故建议不要 next 和 nextLine 连用。
问题3:print 与 printLine 的区别
print()方法和println()方法的不同就是后者在把数据压入缓冲区之后还调用flush方法把缓冲区中的数据推到和操作系统交互的流中,然后操作系统和硬件交互从而显示出控制台信息,print()若是输出的字符串中含有’\n’,则换行符前面的内容会直接显示出来,而换行符之后的内容则会暂存到缓冲区,直到调用下一次的flush方法或者遇到下一个换行符
————————————————
原文链接:https://blog.csdn.net/u012504392/article/details/109888572参考资料:https://blog.csdn.net/a594218234/article/details/108769756
printLine结束会进行换行,但不一定是(\n)它会根据操作系统的不同而变换。
Windows:\r\n Mac:\r Unix:\n
java编译器里 \n 是进行换行(为什么在Windows环境下Java语言用 \n 进行换行?)
拓展:printf
printf() 是JDK5之后才有的,f的意思就是format,也就是格式化。用在System. out上,就是对输出的文字做格式化后再显示在文本模式中。
printf()的第一个自变量是字符串,其中 %d、%h、%b 等是 格式控制符号 。格式控制符号有以下:
符号 | 说明 |
---|---|
%% | 因为%符号已经被用来作为控制符号前置,所以规定使用%%才能在字符串中表示% |
%d | 以十进制整数格式输出,可用于byte、short、int、long、Byte、Short、Integer、Long、BigInteger |
%f | 以十进制浮点数格式输出,可用于float、double、Float、Double或者BigDecimal |
%e |
以科学记号浮点数格式输出,提供的数必须是float、double、Float、Double或者BigDecimal。%e表示输出格式遇到字母以小写表示,如2.13e+12,%E则表示遇到字母以大写表示 |
%b | 输出boolean值,%b表示输出结果会是true或false,%B表示输出结果会是TRUE或FALSE。非null值输出是true或TRUE,null值输出是false或FALSE |
%h | 使用Integer.toHexString(arg.hashCode())来得到输出结果,如果arg是null,则输出null,也常用于想得到十六进制格式输出 |
%x | 以十六进制整数格式输出,可用于byte、short、int、long、Byte、Short、Integer、Long、BigInteger。%x表示输出格式遇到字母以小写表示,%X则表示遇到字母以大写表示 |
%s | 字符串格式符号 |
%c | 以字符符号输出,可用于byte、short、char、Byte、Short、Integer或者Charcater。%c表示输出格式遇到字母以小写表示,%C则表示遇到字母以大写表示 |
%n | 输出平台特定的换行符号,如果Windows下则会置换为”\r\n”,如果是Linux下则会置换为’\n’,如果Mac OS下回置换为’\r’ |
参考资料:https://blog.csdn.net/weixin_44538399/article/details/89083619