我已经阅读了几篇关于pass-by-value如何工作的文章,但是我不能从我的case语句中调用我的序列化方法,因为我没有正确地传递我的“club”变量。我理解它超出了我的“MainMenu”类的范围,但我不知道将它传递给我的“MainMenu”类的语法。
我想过将它传递给我尝试过的“MainMenu”构造函数,但是我需要将类型从object转换为String,我正在努力解决这个问题。
如何阻止“俱乐部”显示“无法找到符号”?这发生在我的Serialize案例陈述中。
这是我的堆栈跟踪,我还包括了最相关的代码片段。
MainMenu.java:19: error: cannot find symbol
MainMenu team = new MainMenu(club);
^
symbol: variable club
location: class MainMenu
MainMenu.java:49: error: cannot find symbol
saveclub1.Serialize(club , club_one);
^
symbol: variable club
location: class MainMenu
MainMenu.java:49: error: cannot find symbol
saveclub1.Serialize(club , club_one);
^
symbol: variable club_one
location: class MainMenu
MainMenu.java:72: error: cannot find symbol
saveclub2.Serialize(club , club_one);
^
symbol: variable club
location: class MainMenu
MainMenu.java:72: error: cannot find symbol
saveclub2.Serialize(club , club_one);
symbol: variable club_one
location: class MainMenu
5 errors
MainMenu.java代码段
String[] clubName = {"Arsenal","Aston Villa", "Bournemouth", "Chelsea", "Crystal Palace", "Everton", "Leicester City", "Liverpool", "Manchester United", "Manchester City", "Newcastle United", "Norwich City", "Southampton", "Stoke City", "Sunderland", "Swansea City", "Tottenham Hotspur", "Watford", "West Brom", "West Ham United"};
String[] Menu = {"Choose Team", "Create Profile","Load Game", "Credits" , "Quit" , "Save Game" , "League Table"};
public MainMenu(ClubInfo club){
// clubName = club; // cast object club, to make it a String e.g clubName?
//constructor
}
public static void main(String args[]){
MainMenu team = new MainMenu(club);
}
来自MainMenu.java的更多信息
case 2:
Serialize saveclub1 = new Serialize();
saveclub1.Serialize(club , club_one);
exit = true;
break;
case 6:
Serialize saveclub2 = new Serialize();
saveclub2.Serialize(club , club_one);
exit = true;
break;
Serialize.java
import java.util.InputMismatchException;
import java.util.Scanner;
import java.io.*;
import java.util.Arrays;
public class Serialize
{
public Serialize(){
//constructor
}
public void Serialize(ClubInfo club , Club1 club_one) // receive return type from printGreeting();
{
String fileName = club.teamName + ".ser";
try {
FileOutputStream fileOut = new FileOutputStream("/home/cg/root/" + fileName);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(club);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in C:/tmp/club.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
import java.io.*;
import java.util.Arrays;
/**
*
* @author Darren Estcourt
*/
public class ClubInfo implements java.io.Serializable{
public ClubInfo(){
//constructor
}
public String teamName;
public String stadium;
public String division;
public transient int SSN;
public int stadiumCapacity;
} // end ClubInfo class
-------------------------------------------------------------------------------
public class Club1{
public Club1(){
//constructor
}
public void club_one(ClubInfo club){
club.teamName = "Arsenal";
club.stadium = "Emirates";
club.division = "Premier League";
club.SSN = 11122333;
club.stadiumCapacity = 60000;
}
}
简而言之,我如何确保“clubMoneu”课程能够确认“club”和“club_one”。以前我一直依赖继承来传递值,但我已经读过构造函数和对象是我可能正在寻找的东西。
我非常感兴趣,非常感谢任何帮助:)
答案 0 :(得分:0)
错误位于MainMenu
,而不是Serialize
。更具体地说,这两行:
saveclub1.Serialize(club , club_one);
saveclub2.Serialize(club , club_one);
您从未使用名称club
或club_one
声明任何变量,但您尝试将它们作为参数传递给函数。
在您尝试修复破坏代码的问题之前,您的代码还有一些我认为需要解决的问题。
问题1
“序列化”是一个动词,表示它应该是方法,而不是类。你可以把它变成ClubInfo
的方法。保存俱乐部的语法变为:
ClubInfo myClub = new ClubInfo(arg1, arg2, arg3);
myClub.serialize();
问题2
您的代码会混淆类和实例。您将Club1
作为一个类,并使club_one
成为一个方法。第一俱乐部应该是ClubInfo
的实例。
ClubInfo club1 = new ClubInfo();
club1.teamName = "Arsenal";
club1.stadium = "Emirates";
问题3
您依靠调用者初始化变量。初始化是构造函数的工作。
public ClubInfo (String teamName, String stadium) {
this.teamName = teamName;
this.stadium = stadium;
}
// Example call to the constructor
Club club1 = new Club("Arsenal", "Emirates");
问题4
您在名为Serialize()
的类中有一个名为Serialize
的方法。如果您必须拥有Serialize类(请参阅问题1,我认为您不应该这样做),请将其重命名为Serializer
。
问题5
如果在try块的中途发生异常,您将无法关闭流。关闭流的正确方法是在try块之前初始化流,并在finally块中关闭它们:
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream("");
// Do something with the stream
} catch(IOException i) {
// Handle error
} finally {
try {
if (fileOut != null) {
fileOut.close();
}
} catch (IOException ex) {
// Ignore exception
}
}
The new way要短得多。这称为“try-with-resource”
try (FileOutputStream fileOut = new FileOutputStream("")) {
// Do something with the stream
} catch(IOException i) {
// Handle error
}
您可以将其扩展到多个资源。有here)的例子。