所以,我正在开发一个项目,可以自动化从角色表到掷骰子的所有东西,我喜欢玩桌面RPG。我试图存储可在执行应用程序开始时访问的字符数据(字符名称,2个统计数组和2个这些stat值的数组)。到目前为止This非常有帮助。
但是,我还想显示名称和统计信息,以便用户确认这是他们想要使用的字符数据。而且我无法以可读格式显示数据。这是我的代码(你会发现我已经找到了问题的底部,但是如果你看到其他任何可以在此过程中进行优化的话,我会很感激任何反馈: - )&# 34;:
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可能尚未初始化。而且我无法弄清楚原因,以及如何获得该长度以便我可以以可读的方式打印出阵列。有没有人有任何想法?感谢。
答案 0 :(得分:1)
您需要初始化局部变量。如果发生异常,则可能无法初始化部分或全部阵列,并且编译器不允许这样做。
摆脱错误的最简单方法是将数组初始化为null
,但程序存在逻辑问题。即使您的程序在此之后无法正常工作,您也会抓住异常并继续。您应该将异常抛出readFile()
方法,然后很可能退出程序。你也可以继续,好像该文件不存在,但至少会显示一个警告。
答案 1 :(得分:0)
您始终必须在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
}
}