【问题标题】:How to get array.length after it has been deserialized [duplicate]反序列化后如何获取array.length [重复]
【发布时间】:2016-09-11 13:02:52
【问题描述】:

因此,我正在开发一个项目,该项目可以自动执行从角色表到掷骰子的所有操作,以打造我喜欢玩的桌面 RPG。我正在尝试存储可以在执行应用程序开始时访问的字符数据(字符名称、2 个统计数据数组和 2 个统计数据数组)。 This 到目前为止一直很有帮助。

但是,我还想显示名称和统计信息,以便用户确认这是他们想要使用的字符数据。而且我无法以可读格式显示数据。这是我的代码(您会发现我在底部遇到的问题,但如果您在此过程中看到任何其他可以优化的内容,我将不胜感激任何反馈:-)“:

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

那么,for 语句中的 sArray1.length 指向底部?它出现了一条错误消息,指出 sArray1 可能尚未初始化。而且我无法弄清楚为什么以及如何获得该长度,以便我可以以可读的方式打印出数组。有没有人有任何想法?谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要初始化局部变量。如果发生异常,可能是部分或全部数组未初始化,编译器不允许这样做。

    摆脱错误的最简单方法是将数组初始化为null,但是您的程序存在逻辑问题。您正在捕获异常并继续,即使在那之后您的程序无法正常工作。相反,您应该从 readFile() 方法中抛出异常,然后很可能退出程序。您也可以像文件不存在一样继续,但至少显示有关它的警告。

    【讨论】:

      【解决方案2】:

      你总是需要在 java 中初始化变量。您在 try 块中执行此操作,但如果发生异常,则数组不会被初始化。

      您可以将 for 循环移至 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
          }
      }
      

      【讨论】:

      • 哇,这样会方便很多。我在想我可能必须创建两种单独的方法来显示和使用。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多