我遇到的问题应该是一项非常简单的任务。我有一个非常大的课程,涵盖了10-15个课程。整个程序以带有GUI的缓冲读写器为中心。用户输入确定如何读取然后转换文件。
无论如何,目前我用这一行设置文件位置。
bw = new BufferedWriter(new FileWriter(NachaMain.saveFile.getSelectedFile()+"\\NachaOutput.ACH"));
如您所见,我使用了常量文件名。一些数据分析师要求我将名称设置为动态,所以我试图添加一个随机数。这就是我添加随机数的方法:
int newNum = 1 + (int)(Math.random() * ((99 - 1) + 1));
String randomNumber = Integer.toString(newNum);
String location = "//"+randomNumber+"NachaOutput.ACH";
bw = new BufferedWriter(new FileWriter(NachaMain.saveFile.getSelectedFile()+location));
到目前为止一切顺利。当我测试"位置"在这个阶段,它完美地运作。问题在于我必须再次为两个不同类的缓冲读者调用此文件。我有一个" FileValidation"获取已完成的缓冲写入器文件并对其进行分析以查找错误的类。我试着打电话给这个"位置"通过使它像这样静态变量:
public static String location;
我尝试在验证类中调用它,如下所示:
br = new BufferedReader(new FileReader(NachaMain.saveFile.getSelectedFile()+MainWriter.location));
文件位置和一切都是正确的问题是在测试"位置"变量出现null。
我不明白这一点。我在我的" NachaMain"中将变量设置为静态。 class然后使用随机数更改它。那么为什么另一个类即使访问已经更改过的静态变量也会出现null?
如果有人有解决方案我会很感激。抱歉,我无法发布更多代码,但我无法看到一种简单的方法来隔离此代码,而且发布整个程序的内容太多了。
重复备注:此问题已被标记为重复。然而,重复的问题只是描述如何初始化变量,我的答案更简单,用它命名变量的类型声明两次的问题。我没有在那篇文章中找到解决方案但是我在这里得到了答案。
答案 0 :(得分:4)
首先关闭 - 你的随机看起来很奇怪:
// Last I checked, 99-1 + 1 was 99 ;-)
int newNum = 1 + (int)(Math.random() * ((99 - 1) + 1));
String randomNumber = Integer.toString(newNum);
为什么不简单
String randomNumber = Integer.toString(new Random().nextInt(100)+1);
但接下来是你的主要问题:
String location = "//"+randomNumber+"NachaOutput.ACH";
这是局部变量的赋值,而不是静态实例变量
将其更改为
location = "//"+randomNumber+"NachaOutput.ACH";
这样,它就可以访问同名的静态成员。你必须确保位置不会“突然”改变。也许每个程序运行一次就足够了?然后添加一个nullcheck:
if(null == location) {
location = "//"+randomNumber+"NachaOutput.ACH";
}
对未提出要求的建议
如果我告诉开发人员将名称设置为“动态”,我会期待一个程序,我可以在某种程度上定义存储的名称。
如何做到这一点(一些,而不是全部)
使用System.property作为默认情况下的文件名
if(null == location){ location =“//”+ System.getProperty(“nacha.file”,“NachaOutput.ACH”); }
在UI中使用可以更改的设置。像菜单“设置”。然后坚持选择Preferences
答案 1 :(得分:2)
您正尝试通过声明其类型为static
字段location
分配值:
String location = "//"+randomNumber+"NachaOutput.ACH";
这可能在一个方法中,并且可能给出location
变量方法范围。
反过来,您的static String location
永远不会被分配,因此它是null
(默认String
值)。
只需在声明之前删除String
类型,即可指定static
字段。
无关,但值得注意......
成语:
int newNum = 1 + (int)(Math.random() * ((99 - 1) + 1));
...仅生成伪随机数,并且不利用java.util.Random#next...
。
我会查看java.util.UUID.randomUUID()
成语,或java.util.Random#next...
以防万一。