黑马程序员技术交流社区

标题: IO流 处理异常时的一点小疑问 [打印本页]

作者: 王海龙    时间: 2012-12-22 13:07
标题: IO流 处理异常时的一点小疑问
  1. public class ProductManager {
  2.     public void save(File f) {
  3.         try {
  4.             ObjectOutputStream oos = new ObjectOutputStream(
  5.                     new FileOutputStream(f));
  6.             Scanner input = new Scanner(System.in);

  7.             System.out.println("Please input prodcutID");
  8.             String id = input.next();
  9.             System.out.println("Please input prodcut name:");
  10.             String name = input.nextLine();
  11.             System.out.println("Please input the price:");
  12.             double price = input.nextDouble();
  13.             System.out.println("Please input the nunmer:");
  14.             int count = input.nextInt();
  15.             Product p = new Product(id, name, count, price);
  16.             oos.writeObject(p);
  17.             

  18.         } catch (FileNotFoundException e) {
  19.             // TODO Auto-generated catch block
  20.             e.printStackTrace();
  21.         } catch (IOException e) {
  22.             // TODO Auto-generated catch block
  23.             e.printStackTrace();

  24. //下面这句代码中,提示无法解析oos,oos不是就在try里面定义的吗?为什么?
  25.         } finally{
  26.             oos.close();
  27.         }

  28.     }

  29. }
复制代码

作者: 王进亮    时间: 2012-12-22 14:33
那是因为在不同的代码块,在try代码块中定义的变量,在其它代码块中访问不到,
要把try {

            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));

改为ObjectOutputStream oos=null;
        try {
             oos = new ObjectOutputStream(
                    new FileOutputStream(f));

即可。
作者: 罗海清    时间: 2012-12-24 18:16
楼主请看这里来!看我改正的部分,因为代码块里定义的变量只在本代码快有效!
所以,改成下面颜色的部分!

public class ProductManager {
    public void save(File f) {
         ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(f));
            Scanner input = new Scanner(System.in);

            System.out.println("Please input prodcutID");
            String id = input.next();
            System.out.println("Please input prodcut name:");
            String name = input.nextLine();
            System.out.println("Please input the price:");
            double price = input.nextDouble();
            System.out.println("Please input the nunmer:");
            int count = input.nextInt();
            Product p = new Product(id, name, count, price);
            oos.writeObject(p);
            

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

//下面这句代码中,提示无法解析oos,oos不是就在try里面定义的吗?为什么?
        } finally{
            oos.close();
        }

    }

}
作者: 郝福明    时间: 2012-12-25 08:39
oos应该在try外面定义,try定义了,其他语句块里访问不到
  1. ObjectOutputStream oos = null;
  2.    try {
  3.                 oos = new ObjectOutputStream(
  4.                 new FileOutputStream(f));
复制代码
还有啊,关闭时应该判断一下是否为空
  1. try {
  2.                 if(oos!=null){
  3.                         cos.close();
  4.                 }
  5.         }catch(IOException e){
  6.                  e.printStackTrace();

  7.         }
复制代码

作者: 黄基焜    时间: 2012-12-25 15:06
定义在try里面是try局部变量,finally块当然访问不到try里面的变量了。
作者: 黄锦成    时间: 2012-12-25 15:26
你在try里面定义的那个oos,只能在try内访问,每个变量都有自己作用域范围,要将oos放到try外面定义


作者: 郭金龙    时间: 2012-12-25 15:51
在try中定义属于局部变量!要放到外面比较好些!




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