黑马程序员技术交流社区

标题: 关于BufferedReader和Scanner获取键盘输入内容 [打印本页]

作者: 刘亚东    时间: 2014-7-6 22:20
标题: 关于BufferedReader和Scanner获取键盘输入内容
这两天做阳哥的技术分练习题时有一点困惑,特发帖求各路大神指点迷津。

就是java中把键盘输入的内容赋值给某个变量,然后再用这个变量进行后续运算。因为java没有像C那样的scanf函数。
求助度娘以后发现有两种方式,

方式一:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入:");
String str = bufferedReader.readLine();
System.out.println("输入的内容是:" + str);

方法二:
Scanner s = new Scanner(System.in);
int num = s.nextInt();
//键盘输入的值赋给了num

我是想输入一个数字然后进行运算,但是方式一不知道为什么编译没有通过,然后用的方式二程序就正常运行了。(都正常导过包)

想问问大家BufferedReader和Scanner这两种方式有什么不同?
以及方式一中有没有什么问题?

作者: sugar    时间: 2014-7-7 08:32
对数据流操作,可能出现异常,所以要处理异常。下面是修改后的代码。
  1. import java.io.*;
  2. class Test
  3. {
  4. public static void main(String[] args)
  5. {

  6. //对流操作有可能楚翔异常,所以要try一下才可以。
  7. BufferedReader bufferedReader=null;
  8. try
  9. {
  10. bufferedReader=new BufferedReader(new InputStreamReader(System.in));
  11. System.out.println("请输入。。。");
  12. String str=bufferedReader.readLine();
  13. System.out.println("输入的内容是:"+str);
  14. }
  15. catch (Exception e)
  16. {
  17. e.printStackTrace();
  18. }
  19. finally
  20. {
  21. //必须关闭资源,而关闭资源时也有可能出现异常,所以try一下
  22. try
  23. {
  24. bufferedReader.close();
  25. }
  26. catch (Exception e)
  27. {
  28. e.printStackTrace();
  29. }

  30. }

  31. }
  32. }
复制代码






作者: lzy418    时间: 2014-7-7 08:43
方式一必须抛异常,一般是IO异常。
作者: 八零、玖羚    时间: 2014-7-7 08:55
方法一使用的时候自己要处理好异常就好,方法二使用简单点
作者: 刘亚东    时间: 2014-7-7 11:25
sugar 发表于 2014-7-7 08:32
对数据流操作,可能出现异常,所以要处理异常。下面是修改后的代码。

那为什么方式二就不会出现异常呢?是不是基础视频会讲到?
作者: 刘亚东    时间: 2014-7-7 11:27
八零、玖羚 发表于 2014-7-7 08:55
方法一使用的时候自己要处理好异常就好,方法二使用简单点

那是不是都能够获取键盘输入的内容?
作者: ddewym123    时间: 2014-7-7 11:41
个人理解:
查阅JAVA api可知:方法一:
InputStreamReader:
  1. public InputStreamReader(InputStream in,
  2.                          String charsetName)
  3.                   throws UnsupportedEncodingException
复制代码
BufferedReader:
  1. public String readLine()
  2. throws IOException
复制代码

也就是说,在方式一中会抛出IOException,它是checkedException。因此,你要么try..catch将其捕获,要么声明异常将其抛出。

方法二:


Scanner:
  1. public Scanner(InputStream source)
复制代码
  1. public int nextInt()

  2. 抛出:
  3. InputMismatchException - 如果下一个标记与 Integer 正则表达式不匹配,或者超出范围
  4. NoSuchElementException - 如果输入信息已耗尽
  5. IllegalStateException - 如果此扫描器已关闭
复制代码

你选择的构造方法没有抛异常。至于nextInt方法,虽然抛出了异常,但查阅可知它们都是RuntimeException的子类,这类异常是运行时异常(uncheckedException),编译时不会检查。因此,方法二编译时不会报错。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2