2016-09-11 7 views
0

私は、キャラクターシートからダイスロールまですべてを自動化するプロジェクトに取り組んでいます。私は、アプリケーションの実行開始時にアクセスできる文字データ(文字の名前、2つの統計情報の配列、およびそれらの統計値の2つの配列)を格納しようとしています。 Thisはこれまでに非常に役立っています。array.lengthを逆シリアル化した後に取得する方法

しかし、ユーザーが使用したい文字データであることをユーザーが確認できるように、名前と統計情報も表示したいと考えています。また、データを読みやすい形式で表示するのに問題があります。

import java.io.*; 
import javax.swing.JOptionPane; 

public class fengShuiFiles implements Serializable {//start class 

    private FileOutputStream outFile; 
    private ObjectOutput objectWriter; 
    private FileInputStream inFile; 
    private ObjectInputStream objectReader; 

    public void WriteFile(String fileNameIn, String[] sArray1, String[] sArray2, 
      String[] sArray3, String[] sArray4) { 
     try { 
      outFile = new FileOutputStream(fileNameIn + ".txt", true); 
      objectWriter = new ObjectOutputStream(outFile); 
      objectWriter.writeObject(sArray1); 
      objectWriter.writeObject(sArray2); 
      objectWriter.writeObject(sArray3); 
      objectWriter.writeObject(sArray4); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(null, "I/O occurred during a write operation\nFor more", 
        "information see console output.", 
        "Read File", JOptionPane.ERROR_MESSAGE); 
      e.printStackTrace(); 
     } // End try/catch 
    } // End Open 

    //not sure if I'll need this. Keeping it for now just in case 
    //public void writeRecords(String textRecords) 
    //{ 
    // outFile.close(); 
    // pw.println(textRecords); 
    //} // End WriteRecords 
    public void ReadFile(String fileNamein) throws FileNotFoundException { 
     fengShuiFiles[] sArray1, sArray2, sArray3, sArray4; 
     try { 
      inFile = new FileInputStream(fileNamein + ".txt"); 
      objectReader = new ObjectInputStream(inFile); 
      sArray1 = (fengShuiFiles[]) objectReader.readObject(); 
      sArray2 = (fengShuiFiles[]) objectReader.readObject(); 
      sArray3 = (fengShuiFiles[]) objectReader.readObject(); 
      sArray4 = (fengShuiFiles[]) objectReader.readObject(); 
     } catch (IOException | ClassNotFoundException e) { 
      JOptionPane.showMessageDialog(null, "I/O error occurred opening a", 
        "file\nFor more information see console output.", 
        "Read File", JOptionPane.ERROR_MESSAGE); 
      e.printStackTrace(); 
     } // End try/catch 

     for (int x = 0; x < sArray1.length; x++) { 

     } 
    } 

    public void closeFile() { 
     try { 
      outFile.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } // End closeFile 
}//end class 

ので:ここに私のコードは、(あなたが道に沿って最適化することができない何かを見れば、私は「:-)任意のフィードバックをいただければ幸いですが、あなたは、私が下の方に持ってる問題を見つけることができますです、そのsArray1.lengthのfor文の最後に?sArray1が初期化されていない可能性があるというエラーメッセージが表示されます。配列を読み込み可能にしていますか?ありがとうございます。

答えて

1

ローカル変数を初期化する必要があります。例外が発生した場合、配列の一部またはすべてが初期化されていない可能性があります。それを許してください。

エラーを取り除く最も簡単な方法は、配列をnullに初期化することですが、プログラムにロジックの問題があります。その後もプログラムが正常に動作することはありませんが、例外をキャッチして継続しています。代わりにreadFile()メソッドから例外をスローし、プログラムを終了する可能性が最も高いです。ファイルが存在しないかのように続行することもできますが、少なくとも警告は表示されます。

0

Javaでは常に変数を初期化する必要があります。これはtryブロックで行いますが、例外が発生した場合、配列は初期化されません。

あなたは、tryブロックのループのために移動することができます。

public void ReadFile(String fileNamein) throws FileNotFoundException { 
    fengShuiFiles[] sArray1, sArray2, sArray3, sArray4; 
    try { 
     ... 
     for(int x = 0; x < sArray1.length; x++) { 

     } 
    } catch (IOException | ClassNotFoundException e) { 
     ... 
    } // End try/catch 
} 

またはcatchブロックで配列を初期化するために、デフォルト値を使用します。かもしれない

public void ReadFile(String fileNamein) throws FileNotFoundException { 
    fengShuiFiles[] sArray1, sArray2, sArray3, sArray4; 
    try { 
     ... 

    } catch (IOException | ClassNotFoundException e) { 
     ... 
     sArray1 = new fengShuiFiles[0]; // Some default value. 
    } // End try/catch 

    for(int x = 0; x < sArray1.length; x++) { 

    } 
} 

何かを読み込み配列を返し、呼び出しメソッドでそれらを使って何かを行うことがより便利です。例えば

public Optional<fengShuiFiles[][]> ReadFile(String fileNamein) throws FileNotFoundException { 

    try { 
     fengShuiFiles[] sArray1, sArray2, sArray3, sArray4; 
     // read the file 
     return Optional.of(new fenShuiFiles[][]{ sArray1, sArray2, sArray3, sArray4 }); 
    } catch (IOException | ClassNotFoundException e) { 
     ... 
     return OPtional.empty(); 
    } 
} 

その後いくつかの他の方法では:

Optional<fengShuiFiles[][]> ret = ReadFile(...); 

if(ret.isPresent()) { 
    for(fengShuiFiles[] arr : ret.get()) { 
     System.out.println(Arrays.toString(arr)); // Print here 
    } 
} 
+0

うわー、それは多くの方が便利だろう。私は表示と利用の2つの方法を別々に作成しなければならないかもしれないと思っていました。本当にありがとう! –

関連する問題