A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯丛政 中级黑马   /  2013-2-13 23:47  /  3883 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 侯丛政 于 2013-2-16 15:24 编辑

       public boolean login(String username, String password) {
                boolean flag = false;
                BufferedReader br = null;            // 在处理异常时为什么把 BufferedReader br 单独定义在外面, 并且置为null ?
                try {
                        br = new BufferedReader(new FileReader(file));

                        String line = null;
                        while ((line = br.readLine()) != null) {
                                String data = line;
                                String[] strArray = data.split("=");
                                if (strArray[0].equals(username)
                                                && strArray[1].equals(password)) {
                                        flag = true;
                                        break;
                                }
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        if (br != null) {
                                try {
                                        br.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                }
                return flag;
        }


评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

正序浏览
首先,一看你这个问题就知道其实你是把“处理异常”和“局部变量”弄混了!

我要说的是,此处此段代码“ BufferedReader br = null;”所放的位置与“处理异常”没有任何关系!

它之所以那样做是因为如果变量“br”定义在了try{    }语句块,那么它就成了一个局部变量,此时它的作用范围就只能局限在此
语句块中,到了后面的finally {}块中,是根本无法访问到此变量的!


所以这完全是“局部”与“全局”的区别,与“异常处理”根本无关,所以你可要分清楚了啊!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
这个就是作用范围的问题了啊,其实并不难理解,我想到了这样一个小例子:
class Person{
        private info in = null;   //定义一个对象     
        public Person(info in){
            this.in = in  //接受这个对象
        }
}

我们都知道,在方法内的变量是局部变量,在方法外不能使用,但又非得在方法内进行赋值操作。为了整体都能访问到这个变量
所以就定义在方法外面作为成员变量,也不会失掉在方法内进行赋值操作的需求。

评分

参与人数 1技术分 +1 收起 理由
职业规划-张琼老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为在try里面的变量是局部变量,作用范围在定义它的最近的一个大括号内。如果是引用的话, 在try 的前面 定义: 类名 br = null;
在try里面给br赋值 。
回复 使用道具 举报
因为如果这么:BufferedReader br = new BufferedReader(new FileReader(file));  写的话在try代码块之中定义的变量br 外面是无法用到的。
所以必须在外面建立引用BufferedReader br = null;            
try中初始化  br = new BufferedReader(new FileReader(file));
这样才能做用于整个函数。(楼主可以试一下,不这么写会报错找不到变量br的)
而这个变量是为了读取东西加速的缓冲区。开始没读东西 当然就定义空了。也就是变量被存储的初始值。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
但是,classpath环境变量尽量少用,因为,一旦配置了classpath,在我们执行class文件的时候,本来是要到当前目录下执行我们需要执行的文件,但是不小心,当前目录下的class文件被删/或不存在,那么它就会自动的执行classpath环境变量下的class文件,这就造成我们不想看到的结果。在java的JDK1.5后就不需要我们配置classpath环境变量了。这给我们减少了很多麻烦。

配置path环境变量的技巧:
我们配置path环境变量的时候,路径会改变,会造成路径改错。我们可以使用用户变量如:JAVA_HOME配置jdk路径,再把JAVA_HOME作内容配置在path环境变量中。

我们到别人的计算机上运行或编写一个java程序,别人机器上又没有装有jdk。我们也不需要去装一个jdk,更不需要配置path环境变量,这里我们可以使用set命令临时的配置一个环境变量。
如set path=jdk路径

评分

参与人数 1技术分 +1 收起 理由
职业规划-张琼老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马