传递给 StringBuffer 或 StringBuilder 构造函数的字符¶
ID: java/string-buffer-char-init
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- reliability
- maintainability
Query suites:
- java-security-and-quality.qls
将字符传递给 StringBuffer
或 StringBuilder
的构造函数可能是想将该字符插入到新创建的缓冲区中。然而,实际上字符值会被转换为整数,并被解释为缓冲区的初始容量,这可能会产生意想不到的结果。
示例¶
以下示例展示了一个表示二维笛卡尔坐标系中点的类。toString
方法使用 StringBuffer
构造一个可读的表示形式 (x, y)
,其中 x
和 y
是点的坐标。
但是,左括号作为字符字面量传递给了 StringBuffer
构造函数。该字符没有被用来初始化缓冲区的内容,而是被转换为整数值 40,并被解释为缓冲区的初始容量。因此,toString
返回的字符串表示形式将缺少左括号。(请注意,另一方面,将字符传递给 append
是没有问题的。)
class Point {
private double x, y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
StringBuffer res = new StringBuffer('(');
res.append(x);
res.append(", ");
res.append(y);
res.append(')');
return res.toString();
}
}
建议¶
如果用于初始化缓冲区的字符是字符字面量,只需将其替换为相应的字符串字面量。因此,在我们的示例中,将 new StringBuffer('(')
替换为 new StringBuffer("(")
。如果字符不是字面量值,请使用方法 String.valueOf
将其转换为字符串。
参考文献¶
J. Bloch 和 N. Gafter,《Java 解惑:陷阱、缺陷和难题》,谜题 23。Addison-Wesley,2005 年。
NetBeans IDE:Java 提示
Java API:StringBuffer,java.lang.StringBuilder。