用户提供的数组直接存储

时间:2014-05-05 11:11:22

标签: java arrays sonarqube

我已提到:Security - Array is stored directly

我的代码是

public IndexBlockAdapter(String[] itemStr) {
    if(itemStr == null) { 
        this.itemStr = new String[0]; 
    } else { 
        this.itemStr = Arrays.copyOf(itemStr, itemStr.length); 
    }
}

但是Sonar仍然会选择它并抱怨" Array直接存储"尽管制作副本。我很困惑。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

Arrays.copyOf does a shallow copy. 

它只是复制引用而不是实际值。 以下代码将打印所有true,证明事实

String [] str1 = {"1","2","3"};

    String [] str2 = Arrays.copyOf(str1, str1.length);
    for (int i=0;i<str1.length;i++) {
        System.out.println(str1[i] == str2[i]);

    }

相反,如果你使用下面的代码,你将做一个深层复制,你应该是好的

String [] str3 = new String[str1.length];
for (int i=0;i<str1.length;i++) {
    str3[i] = new String(str1[i]);
}
for (int i=0;i<str1.length;i++) {
    System.out.println(str1[i] == str3[i]);
}

答案 1 :(得分:0)

这应该对你有用

 public IndexBlockAdapter(String[] newItemStr) {
 if(newItemStr == null) { 
    this.itemStr = new String[0]; 
 } else { 
    this.itemStr = Arrays.copyOf(newItemStr, newItemStr.length); 
 }
}