Scanner,Are you kidding me?

让新手脑壳疼的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! 现在看不出来有什么影响,可当未来程序足够大,需要使用各种资源的时候,你就会明白即使关闭不用的资源是多么舒服.

好了,本期到这就结束了!喜欢的点个关注吧
欢迎评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值