-1

ベクトルをテキスト ファイルに読み書きしようとしています。Car というクラスのオブジェクトを含むベクトルを作成するクラス WriteVectorToFile (以下に示す) を作成しました。クラス 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 ブロックからは見えません。Hereobjinは、インスタンス レベルで宣言されたインスタンス変数を指し、それは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();

    }

したがって、解決策は、すべてを 1 つの "try" ブロックに入れ、すべての例外を個別にキャッチすることです (または、スーパークラスとして Exception を使用して一緒にキャッチすることもできます [お勧めできません])。これでうまくいくはずです。とにかくそれを解決することができたら教えてください。

于 2013-04-24T08:45:02.010 に答える