-1

我正在尝试将矢量写入和读取文本文件。我创建了一个类 WriteVectorToFile(如下所示),它创建了一个包含名为 Car 的类的对象的向量。Car 类实现了 Serializable 并且仅包含带有 setter 和 getter 方法的信息。在 WriteVectorToFile 类中,我创建了一个 createVector() 方法和 writetoFile() 方法,它们可以工作。readtoFile() 方法中的问题,它给出了一个错误(如下所列)。我想知道我做错了什么以及导致问题的原因。

The error :
java.lang.NullPointerException
    at WriteVectorToFile.readtoFile(WriteVectorToFile.java:73)
    at WriteVectorToFile.main(WriteVectorToFile.java:110)
    at __SHELL1.run(__SHELL1.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at bluej.runtime.ExecServer$3.run(ExecServer.java:725)

代码:

import java.io.*;
import java.util.Vector;

public class WriteVectorToFile{

    private Car car1; 
    private Vector garage;
    private File myFile;
    private FileOutputStream out;
    private FileInputStream in;
    private ObjectInputStream objin;
    private ObjectOutputStream objout;

  public WriteVectorToFile(){

      this.myFile = new File("E:/JAVA/My Java Programs/MyVectorFile.txt");

      try{
        myFile.createNewFile();
        System.out.println("New File --> Success.");
      }catch(IOException e){
        e.printStackTrace();
        System.out.println("New File --> Fail.");
      }   

    }

    private void writetoFile(){
       try{
           out = new FileOutputStream(myFile);
           objout = new ObjectOutputStream(out);

        }catch(FileNotFoundException e){ 
           e.printStackTrace();
        }catch (IOException e){
           e.printStackTrace();
        }

        try{
         objout.writeObject(garage);
         objout.close();
         System.out.println("Write File --> Success.");
       }catch(IOException e){
         System.out.println("Write File --> Fail.");
         e.printStackTrace();
        }

    }

    private void readtoFile(){
       try{
         FileInputStream in = new FileInputStream(myFile);
         ObjectInputStream objin = new ObjectInputStream(in);
       }catch(FileNotFoundException e){ 
          e.printStackTrace();
       }catch(IOException e){
          e.printStackTrace();
       }

       // Object obj = null;
       Vector tempVec = new Vector();

       try{ 

    ERROR Line 73 : tempVec = (Vector) objin.readObject(); 
          objin.close();
          System.out.println("Read File --> Success.");

        }catch(Exception e){

          System.out.println("Read File --> Fail.");
          e.printStackTrace();

        }

       //Car tempg = new Car();
       //tempg = (Car) vecNew.firstElement();

       //System.out.println(tempg.toString());
       //System.out.println(((Car)(vecNew.firstElement())).toString());

    }

    private void createVector(){

       this.garage = new Vector();
       // To create a vector with a specific datatype add <type>
       // Vector garage = new Vector<Car>();

       car1 = new Car("3245","Toyota","Ferry23",(double)34500);
       this.garage.add(car1);
       this.garage.add(new Car("3232","Fiat","MozoZ3",(double)25000));
       this.garage.add(new Car("2345","Mazda","ZenFix",(double)13700));

    }

    public static void main (String[] args){

       WriteVectorToFile test = new WriteVectorToFile();
       test.createVector();
       test.writetoFile();
       test.readtoFile();

    }

}
4

2 回答 2

0

因为您已将 private ObjectInputStream objin;as 实例变量定义为null. 所以当你调用objin.readObject();on时null会抛出NullPointerException. 在该readtoFile()方法中,您可以执行以下操作:

try{
     FileInputStream in = new FileInputStream(myFile);
     ObjectInputStream objin = new ObjectInputStream(in);
   }catch(FileNotFoundException e){ 
      e.printStackTrace();
   }catch(IOException e){
      e.printStackTrace();
   }

这定义了一个新的本地ObjectInputStream objin = new ObjectInputStream(in);内部 try 块,它对外部tempVec = (Vector) objin.readObject();try-catch 块的代码是不可见的。这里objin指的是在实例级别声明的实例变量,它是null. 为了纠正它改变

ObjectInputStream objin = new ObjectInputStream(in);

objin = new ObjectInputStream(in);

在 try 块内。

于 2013-04-24T07:54:53.777 回答
0

首先,很抱歉,因为我无法将其作为评论发布,所以将其放入答案块中:

您的问题是涉及 try-catch 块的范围不匹配。如果您使用过任何 C++,则对象是按值或引用传递的,因此可以非常方便地避免这种情况。但是 Java 通过值传递所有内容,所以当你这样做时:

   try{
     FileInputStream in = new FileInputStream(myFile);
     ObjectInputStream objin = new ObjectInputStream(in);
   }catch(FileNotFoundException e){ 
      e.printStackTrace();
   }catch(IOException e){
      e.printStackTrace();
   }

该对象objin是在 try-catch 范围内创建的,当您在以下情况下使用它时并不相同:

tempVec = (Vector) objin.readObject(); 
      objin.close();
      System.out.println("Read File --> Success.");

    }catch(Exception e){

      System.out.println("Read File --> Fail.");
      e.printStackTrace();

    }

因此,解决方案是将所有内容放在一个“尝试”块中,并分别捕获所有异常(甚至一起使用 Exception 作为超类 [不是一个好习惯])。这应该可以完成这项工作。告诉我们你是否设法解决它。

于 2013-04-24T08:45:02.010 回答