引用在循环中更改的最终变量

时间:2018-05-17 20:34:49

标签: java arrays string file

private void loadFromFolder(String folderPath, PApplet loader) {
    File folder = new File(folderPath);
    final String[] files = folder.list();
    for(int i = 0; i < files.length; i++) {
        String filePath = files[i].substring(0, files[i].indexOf("."));
        images.put(filePath, loader.loadImage(folderPath+fileSeparator+files[i]));
        System.out.print(files);
        System.out.print(": " + filePath + ", " + i + "\n");
    }
}

当我运行此代码时,我想将文件夹(folderPath)中的所有图像文件添加到hashMap,其中包含.png之前的所有内容的字符串作为键。无论出于何种原因,Strings的最终数组以某种方式改变了它的引用,并且我在各地跳来跳去。我真的尝试过,但我无法解决这个问题。任何人都可以向我解释这个吗?我的控制台打印在下面。 (我的代码全部在一个线程中,所以这不是问题)

[Ljava.lang.String;@3d207c96: 1stBulletBar, 0
[Ljava.lang.String;@3d207c96: 1stEmptyBar, 1
[Ljava.lang.String;@3d207c96: 1stHealthBar, 2
[Ljava.lang.String;@3d207c96: 1stStaminaBar, 3
[Ljava.lang.String;@246ef213: 1stBulletBar, 0
[Ljava.lang.String;@3d207c96: BulletBar, 4
[Ljava.lang.String;@3d207c96: BulletBarCap, 5
[Ljava.lang.String;@246ef213: 1stEmptyBar, 1
[Ljava.lang.String;@3d207c96: Button, 6
[Ljava.lang.String;@246ef213: 1stHealthBar, 2
[Ljava.lang.String;@3d207c96: ButtonLeft, 7
[Ljava.lang.String;@246ef213: 1stStaminaBar, 3
[Ljava.lang.String;@3d207c96: ButtonLeftPressed, 8
[Ljava.lang.String;@246ef213: BulletBar, 4
[Ljava.lang.String;@246ef213: BulletBarCap, 5
[Ljava.lang.String;@3d207c96: ButtonPressed, 9
[Ljava.lang.String;@246ef213: Button, 6
[Ljava.lang.String;@246ef213: ButtonLeft, 7
[Ljava.lang.String;@3d207c96: ButtonRight, 10
[Ljava.lang.String;@246ef213: ButtonLeftPressed, 8
[Ljava.lang.String;@246ef213: ButtonPressed, 9
[Ljava.lang.String;@3d207c96: ButtonRightPressed, 11
[Ljava.lang.String;@246ef213: ButtonRight, 10
[Ljava.lang.String;@3d207c96: EmptyBar, 12
[Ljava.lang.String;@246ef213: ButtonRightPressed, 11
[Ljava.lang.String;@1e172402: 1stBulletBar, 0
[Ljava.lang.String;@3d207c96: FirstInventoryPiece, 13
[Ljava.lang.String;@246ef213: EmptyBar, 12
[Ljava.lang.String;@1e172402: 1stEmptyBar, 1
[Ljava.lang.String;@3d207c96: HealthBar, 14
[Ljava.lang.String;@246ef213: FirstInventoryPiece, 13
[Ljava.lang.String;@3d207c96: HealthBarCap, 15
[Ljava.lang.String;@1e172402: 1stHealthBar, 2
[Ljava.lang.String;@246ef213: HealthBar, 14
[Ljava.lang.String;@1e172402: 1stStaminaBar, 3
[Ljava.lang.String;@3d207c96: HUD, 16
[Ljava.lang.String;@246ef213: HealthBarCap, 15
[Ljava.lang.String;@1e172402: BulletBar, 4
[Ljava.lang.String;@3d207c96: InventoryCap, 17
[Ljava.lang.String;@1e172402: BulletBarCap, 5
[Ljava.lang.String;@246ef213: HUD, 16
[Ljava.lang.String;@3d207c96[Ljava.lang.String;@1e172402: Button, 6
: InventoryPiece, 18
[Ljava.lang.String;@1e172402: ButtonLeft, 7
[Ljava.lang.String;@246ef213: InventoryCap, 17
[Ljava.lang.String;@3d207c96: StaminaBar, 19
[Ljava.lang.String;@1e172402: ButtonLeftPressed, 8
[Ljava.lang.String;@3d207c96: StaminaBarCap, 20
[Ljava.lang.String;@246ef213: InventoryPiece, 18
[Ljava.lang.String;@1e172402: ButtonPressed, 9
[Ljava.lang.String;@3d207c96: Title, 21
[Ljava.lang.String;@246ef213: StaminaBar, 19
[Ljava.lang.String;@1e172402: ButtonRight, 10
[Ljava.lang.String;@3d207c96: TitleLeft, 22
[Ljava.lang.String;@246ef213: StaminaBarCap, 20
[Ljava.lang.String;@1e172402: ButtonRightPressed, 11
[Ljava.lang.String;@246ef213: Title, 21
[Ljava.lang.String;@3d207c96: TitleRight, 23
[Ljava.lang.String;@246ef213: TitleLeft, 22
[Ljava.lang.String;@1e172402: EmptyBar, 12
[Ljava.lang.String;@246ef213: TitleRight, 23
[Ljava.lang.String;@1e172402: FirstInventoryPiece, 13
[Ljava.lang.String;@1e172402: HealthBar, 14
[Ljava.lang.String;@1e172402: HealthBarCap, 15
[Ljava.lang.String;@246ef213: ui_big_pieces, 24
[Ljava.lang.String;@3d207c96: ui_big_pieces, 24
[Ljava.lang.String;@1e172402: HUD, 16
[Ljava.lang.String;@1e172402: InventoryCap, 17
[Ljava.lang.String;@1e172402: InventoryPiece, 18
[Ljava.lang.String;@1e172402: StaminaBar, 19
[Ljava.lang.String;@1e172402: StaminaBarCap, 20
[Ljava.lang.String;@1e172402: Title, 21
[Ljava.lang.String;@1e172402: TitleLeft, 22
[Ljava.lang.String;@1e172402: TitleRight, 23
[Ljava.lang.String;@1e172402: ui_big_pieces, 24
编辑:我忘了提到我的代码在eclipse的调试模式下运行时正常运行。以下是在方法的第一行有断点的那些结果。

[Ljava.lang.String;@6e9cfc2e: 1stBulletBar, 0
[Ljava.lang.String;@6e9cfc2e: 1stEmptyBar, 1
[Ljava.lang.String;@6e9cfc2e: 1stHealthBar, 2
[Ljava.lang.String;@6e9cfc2e: 1stStaminaBar, 3
[Ljava.lang.String;@6e9cfc2e: BulletBar, 4
[Ljava.lang.String;@6e9cfc2e: BulletBarCap, 5
[Ljava.lang.String;@6e9cfc2e: Button, 6
[Ljava.lang.String;@6e9cfc2e: ButtonLeft, 7
[Ljava.lang.String;@6e9cfc2e: ButtonLeftPressed, 8
[Ljava.lang.String;@6e9cfc2e: ButtonPressed, 9
[Ljava.lang.String;@6e9cfc2e: ButtonRight, 10
[Ljava.lang.String;@6e9cfc2e: ButtonRightPressed, 11
[Ljava.lang.String;@6e9cfc2e: EmptyBar, 12
[Ljava.lang.String;@6e9cfc2e: FirstInventoryPiece, 13
[Ljava.lang.String;@6e9cfc2e: HealthBar, 14
[Ljava.lang.String;@6e9cfc2e: HealthBarCap, 15
[Ljava.lang.String;@6e9cfc2e: HUD, 16
[Ljava.lang.String;@6e9cfc2e: InventoryCap, 17
[Ljava.lang.String;@6e9cfc2e: InventoryPiece, 18
[Ljava.lang.String;@6e9cfc2e: StaminaBar, 19
[Ljava.lang.String;@6e9cfc2e: StaminaBarCap, 20
[Ljava.lang.String;@6e9cfc2e: Title, 21
[Ljava.lang.String;@6e9cfc2e: TitleLeft, 22
[Ljava.lang.String;@6e9cfc2e: TitleRight, 23
[Ljava.lang.String;@6e9cfc2e: ui_big_pieces, 24

当每行打印线程ID时,我为每一行打印获得Thread [Animation Thread,5,main]

2 个答案:

答案 0 :(得分:1)

问题中的数据对于files数组有三个不同的值,并且计数器的每个都从0到24运行。显然,对这种方法的三次调用正在三个不同的线程中同时进行。来自您的评论:

  

我有一堆Scene对象可以扩展处理的PApplet。这个类中有一个布尔值。在处理setup()中创建场景时,将调用该方法。如果该布尔值为false,则调用此方法,然后将布尔值设置为true,这样如果另一个场景尝试调用它,则不会发生任何事情。

你有一个race condition,其中三个线程正在检查布尔值,并在其中任何一个看到布尔值已经设置之前调用此方法。如何解决这个问题取决于代码在测试和设置变量以及进行调用时的样子。

答案 1 :(得分:0)

您应该阅读this post

关键字final仅表示您只能初始化变量一次。 意味着价值无法改变。实际上,您可以调用方法并根据需要更改final变量的值。

我怀疑你实际上是在改变变量的值而不是它的参考值。