访问不同类中的随机数字符串

时间:2015-12-17 15:37:17

标签: java

我遇到的问题应该是一项非常简单的任务。我有一个非常大的课程,涵盖了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?

如果有人有解决方案我会很感激。抱歉,我无法发布更多代码,但我无法看到一种简单的方法来隔离此代码,而且发布整个程序的内容太多了。

重复备注:此问题已被标记为重复。然而,重复的问题只是描述如何初始化变量,我的答案更简单,用它命名变量的类型声明两次的问题。我没有在那篇文章中找到解决方案但是我在这里得到了答案。

2 个答案:

答案 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...以防万一。