Java 如何在另一个类中使用方法(Try-Catch内部)中的变量?
所以我尝试使用JFrames创建一个基本的RPG用户ID选择菜单;我选择使用单选按钮显示ID选项。一旦用户选择了ID,我就用JOptionPane将其打嗝回来。所有这些都是在MyClass类中完成的。当用户选择ID时,我从一个.txt文件中读取,以对照用户的选择进行检查,因为每个用户ID都与一个字符相关联,该字符的统计信息也包含在.txt文件中。我能够分解.txt文件的多行,并将所有不同的特征存储为单个字符串。我的问题是,现在我想在MyClass之外创建另一个类,使用JFrames显示所述特征,我在传递变量时遇到了问题,因为.txt文件的分解是在Try-Catch中完成的,根据我读到的内容,这些变量只包含在Try-Catch的范围内。这就是我提到的第一个类中的方法的样子:Java 如何在另一个类中使用方法(Try-Catch内部)中的变量?,java,oop,scope,try-catch,Java,Oop,Scope,Try Catch,所以我尝试使用JFrames创建一个基本的RPG用户ID选择菜单;我选择使用单选按钮显示ID选项。一旦用户选择了ID,我就用JOptionPane将其打嗝回来。所有这些都是在MyClass类中完成的。当用户选择ID时,我从一个.txt文件中读取,以对照用户的选择进行检查,因为每个用户ID都与一个字符相关联,该字符的统计信息也包含在.txt文件中。我能够分解.txt文件的多行,并将所有不同的特征存储为单个字符串。我的问题是,现在我想在MyClass之外创建另一个类,使用JFrames显示所述特征,
public void checkID()
{
StringBuilder allInfo=null;//用于存储所有信息
String line=null;//用作循环和生成字符串生成器的条件
字符串strAll2=null;
字符串[]sa=null;
字符串[]sb=null;
字符串[]sd=null;
字符串[]se=null;
BufferedReader br=null;
//用户Id作为字符串
试一试{
br=新的BufferedReader(新的文件读取器(“charList.txt”);
allInfo=新的StringBuilder();
而((line=br.readLine())!=null)
{
allInfo.append(第+行“\n”);
}
strAll2=allInfo.toString();//将charList.txt的所有信息作为一个StringBuilder
sa=strAll2.split(“\n”);//将charList.txt的所有信息作为字符串
sb=sa[0]。拆分(“\t”);//将文件第一行的所有信息作为单个字符串
sd=sa[1]。拆分(“\t”);//文件第二行的所有信息作为单个字符串
se=sa[2]。拆分(“\t”);//将文件第三行的所有信息作为单个字符串
if(firstIdButton.isSelected())
{
strId=sb[0];
}
其他的
{
if(secondIdButton.isSelected())
{
strId=sd[0];
}
其他的
{
if(thirdIdButton.isSelected())
{
strId=se[0];
}
}
}
ID=Integer.parseInt(strId);
}//尝试结束
捕获(IOE异常){
e、 printStackTrace();
}//捕获结束
setVisible(false);//隐藏窗口
}//检查结束id方法
我在主类中将ID和strId分别声明为public int和String,现在,我希望在MyClass之外的另一个类中调用ID,并可能通过几个if-else运行它,以查看要显示的字符。问题是,当我实例化构造函数并尝试访问变量时,它返回一个0,因为try-catch的作用域不允许我用在块内获得的值传递它。我还试图让我的方法返回ID的值,但在MyClass之外我遇到了相同的问题
这就是我在实现它时遇到的问题
公共类字符编辑器{
publicstaticvoidmain(字符串[]args)抛出IOException{
MyClass iw=新的MyClass();
int theID=iw.ID;
System.out.println(theID);
}
}你需要把你的班级和他们的职责分开。您需要模型类:表示游戏角色的类,以及执行游戏所需计算的类。差不多
/**
* A character from the game Toon.
* @see http://en.wikipedia.org/wiki/Toon_(role-playing_game)
*/
public class Toon implements Serializable {
private int muscle;
private int zip;
private int smarts;
private int chutzpah;
private String name;
private String species;
// Constructor, getters, setters, etc.
}
您需要一个或多个视图类:自定义JFrames
和SwingActionListeners
。这些不应该用于验证ID或从文本文件读取数据
你的
MyClass
(这是一个你想要避免的名字,因为六个月后你会忘记你要做的事情),去掉它所有的JFrames
,而JButtons
成为一个控制器。It和同级类从文本文件中读取Toons
,并将它们放入模型类中。它从视图中侦听ActionEvent
s,尝试执行用户想要的操作,或者更新模型和视图,或者向视图报告错误,而不使用模型。在CharacterEditor
类中,您只实例化了MyClass
,而不会调用checkID()
并为ID
和strId
分配适当的值(除非您在构造函数中调用它)
没有checkID()
ID将默认为0(未初始化的int
成员变量的默认值),并且strId
将保持null
。您认为try-catch在某种程度上阻止了设置为在其他位置可见的值,这是不正确的
就像任何其他带大括号的Java构造一样,Try catch创建自己的范围
,并且在范围内声明的任何内容在范围外都不可见。但是,如果一个变量已经存在于它的作用域之外(就像您的例子中的ID),那么在该作用域内对它的值所做的任何更改也会反映在它的作用域之外
而且,最好将成员字段声明为
private
,并提供public
getter(以及可变属性的setter),以便在其他类中访问它们。此外,正如@DaveNewton
所指出的,如果建议使用,请使用。我不太了解您的问题是什么。你真的试过这么做吗?是否有任何错误?如果需要注释右括号,则说明块太长。Colin-I添加了更多代码以显示问题所在。我确实尝试过这个,但没有得到任何运行时错误,但是我在MyClass中得到的ID值与我在MyClass中得到的ID值不匹配
MyClass iw= new MyClass();
iw.checkID(); // MISSING!
int theID=iw.ID;
System.out.println(theID);