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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 宋超2356 于 2014-3-27 12:01 编辑
  1. <div class="blockcode"><blockquote>import java.io.* ;

  2. public class Test {
  3.         public static void main(String [] args) {

  4.                 File f= new File("c:") ;
  5.                 try
  6.                 {
  7.                         OutputStream out = new FileOutputStream(f) ;
  8.                 }
  9.                 catch(Exception e) {
  10.                         e.printStackTrace();
  11.                 }
  12.                 try {
  13.                         out.close() ;//这里出错
  14.                 } catch (IOException e) {
  15.                         // TODO Auto-generated catch block
  16.                         e.printStackTrace();
  17.                 }
  18.         }
  19. }
复制代码

但是这样就没错
  1. import java.io.* ;

  2. public class Test {
  3.         public static void main(String [] args) {

  4.                 File f= new File("c:") ;
  5.                 OutputStream out = null ;
  6.                 try
  7.                 {
  8.                         out = new FileOutputStream(f) ;
  9.                 }
  10.                 catch(Exception e) {
  11.                         e.printStackTrace();
  12.                 }
  13.                 try {
  14.                         out.close() ;
  15.                 } catch (IOException e) {
  16.                         // TODO Auto-generated catch block
  17.                         e.printStackTrace();
  18.                 }
  19.         }
  20. }
复制代码
为什么

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
  1. public class ExceptionDemo
  2. {
  3.         public static double div(int a,int b)throws Exception
  4.         {
  5.                 return a/b;
  6.         }
  7.         public static void main(String[]agrs)
  8.         {
  9.                 int n=5;
  10.                 int m=2;
  11.                 try
  12.                 {
  13.                         double s=div(m,n);
  14.                 }
  15.                 catch (Exception e)
  16.                 {
  17.                         e.printStackTrace();
  18.                 }
  19.                 System.out.println(s);//这里也会显示s找不到符号
  20.         }
  21. }
复制代码

首先我写的这段小代码,你可以直接尝试编译下,你会发现这个编译报错和你第一个代码出现的问题是类似的
都是什么符号没找到,你的代码中是out符号找不到,我的是s符号找不到
至少我们可以直接排除是因为流操作的问题导致的错误吧

我的理解吧  我们是在try中定义了一个变量(你的是out,我的是s),假如在try中的代码没有出错,没有抛出异常的话那么程序就是在try中成功的定义了一个变量(实例),因此在后面我们就可以使用这个变量
假如不知道因为什么原因,try中的代码块出错了,抛出了异常,是不是可以理解为这个引用或变量没用成功的被创建,既然没有成功创建,你怎么能使用一个没有被声明的变量了,所以提示找不到符号,你的第二个代码中,你的out已经被先声明了并初始化为null,然后你在try中假如出现异常,造成的结果是out没有被成功赋值,但他在开头已经被声明了,所以可以使用     书上不是说变量得先声明后使用
我说的比较废话 不够简短 但我觉得你能理解!!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个try中如果发生异常,则out创建失败,第二个try中就会报找不到符号,
回复 使用道具 举报
哇哈哈 这个我知道。
3.26日IO公开课老师有讲到,毕姥爷视频也有讲到。
知识点:变量的作用范围是在一段大括号内,大括号内定义的变量在大括号结束后就没了。
  1. OutputStream out = null ;
  2. try{
  3.   out = new FileOutputStream(f) ;
  4.   //...
  5.   //其他代码
  6. }catch(){
  7. }finally{}
复制代码

将变量定义到外面初始化为null,这种书写格式叫做:扩大变量的作用范围
回复 使用道具 举报
给你举个简单的例子:
class  Demo
{
        public static void main(String[] args)
        {
                int num = 0;
                for (int i=0; i<10; i++)
                {
                        num++;
                }
                System.out.println(num);
                System.out.println(i); //编译时这里会提示找不到符号:i,因为你在for内定义的i,for结束后i就没有了
        }
}
回复 使用道具 举报
因为你把对象定义在try...catch里面,这样对象只在这个代码块中有效,这个代码块使用完对象就失效了。跟在if()循环里面定义变量是一样原理的,只在这个代码块有效。你这个代码还有很多需要改进的地方,例如,关闭流资源,必须用finally,而且需要判断对象是否为空。
回复 使用道具 举报
快(把多个语句用括号{}括起来组成的一个语句)作用域的问题----块是指由一对花括号括起来的若干条简单的JAVA语句,块决定了变量的作用域,也就是说在块里面定义的变量,它的作用范围只能到{}里面的语句执行结束(个人理解是这个变量出了作用范围并不会马上被垃圾回收),你上面的语句如果第二个try语句在第一个里面就不会有错
回复 使用道具 举报
是的try里面就相当是一个代码块,如果你把变量给定义在局部代码块里面了,程序执行完了变量即没了。所以如果对象就不存在,你再关闭它就出现了异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马