让新手脑壳疼的Scanner
相见时难别亦难
很多朋友一开始写java,很纳闷为什么java的输入流那么让人头疼,不像c,c++,上来就是输入三联:int ,printf,scanf/cout/cin ; 其实,这都怪java出生的时候不好好按程序走,大家都是先爬再学会走,它倒好直接娘胎出来就直接跑了…好了不扯犊子
原因很简单:java诞生的时候,开发者就认为你已经具备了良好的编程的水平,所以就呵呵了.好了今天斗胆向各位介绍一下这让人头疼的Scanner
老规矩,先放code
Scanner input=new Scanner(System.in);
System.out.println("input please:!");
String str=input.next();
System.out.println("your input is:"+str);
运行结果
input please:!
菜鸟
your input is:菜鸟
解释一哈:要想使用输入流,必须使用java.util.Scanner 这个包,然后将系统输入流System.in 放进去,先别细问为什么,到io流的时候你自然明白了, 然后最终要的就是你要使用哪种方式的输入流,比如本例我想使用String 的输入流那就.next()
大佬如果看到了.next(),想必知道我接下来的意图:下面介绍几个新手必掉之坑
No1
System.out.print("使用.next():");
String str1=new Scanner(System.in).next();
System.out.println(".next():"+str1);
System.out.print("使用.nextLine():");
String str2=new Scanner(System.in).nextLine();
System.out.println("使用.nextLine():"+str2);
使用.next():我是 菜鸟
.next():我是
使用.nextLine():你才是 菜鸟
使用.nextLine():你才是 菜鸟
哈哈,有没有看山不是山的感觉,二者都能使用字符串的输入,但是应用场景不同,
.next()适用于一次性输入,如果你想试图输入多个不同类型的值,那么肯定会使用空格间隔,而我next才不鸟你,我见到空格我就不爽,说不要就不要了
而.nextLine()相对气度好一点,来者不拒.他只有遇到换行符才会读取结束
不过你要是懒到自闭,非用next不可 也不是不能解决这个问题
无非就是骗自己咯
Scanner input=new Scanner(System.in);
System.out.println("下面连续输入.next和.nextInt");
String str=input.next();
int num=input.nextInt();
System.out.println("String输入值:"+str+"int输入值:"+num);
下面连续输入.next和.nextInt
菜鸡 1
String输入值:菜鸡int输入值:1
你会发现这样做,系统只会考虑一次输入,学过c的朋友想想缓冲区就明白了
No2
Scanner input=new Scanner(System.in);
System.out.println("下面分别输入.next和.nextInt");
System.out.println("请输入string类型:");
String str=input.next();
System.out.println("请输入int类型:");
int num=input.nextInt();
System.out.println("String输入值:"+str+"int输入值:"+num);
下面分别输入.next和.nextInt
请输入string类型:
菜鸡
请输入int类型:
1号
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Test.Test.main(Test.java:14)
哦豁,这怎么凉了啊,控制台说类型不匹配,仔细观察原来整形输入错了,这是很多新手很容易忽略,所以使用哪种类型输入,一定要仔细检测
这里,博主推荐一份检测输入合法性code
Scanner input=new Scanner(System.in);
System.out.println(“please input a int:”);
int num=0;
if(input.hasNextInt()) {
num=input.nextInt();
}
else {
System.err.println(“error!not is a int”);
}
please input a int:
1号
error!not is a int
No3
这个坑是给比菜鸟牛一点 比大佬差一点的人挖的,look!
static Scanner input=new Scanner(System.in);
public static void main(String[] args) {
System.out.println("please input more int!");
int num=0;
while(true) {
num=input.nextInt();
System.out.println("num:"+num);
input.close();
}
}
please input more int!
2
num:2
Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Scanner.java:1070)
at java.util.Scanner.next(Scanner.java:1465)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Test.Test.main(Test.java:11)
解决方案:
我们可以再调用scanner的时候手动调用系统的析构函数finalize(),至于他的概念自己baidu一下咯,他的作用就是协助程序员去释放一下所书写类中的资源和对象,具体使用:
@Override
protected void finalize() throws Throwable {
input.close();
System.out.println("输入流关闭!");
}
能够写出这个,起码这已经不是菜鸟了,因为他知道,良好的习惯是用完scanner随手关闭,可惜,他忽略了这是个天大的坑,那就是 scanner有个毛病,你只要关闭1次,后面的就都无法输入,甚至你继续new 一个Scanner,都无法解决, 也许你会说,那就不关了,ok,your boss will kill you! 现在看不出来有什么影响,可当未来程序足够大,需要使用各种资源的时候,你就会明白即使关闭不用的资源是多么舒服.
好了,本期到这就结束了!喜欢的点个关注吧
欢迎评论