【发布时间】:2020-01-07 10:02:22
【问题描述】:
我正在尝试检查两个列表是否包含相同的值,但我无法弄清楚为什么这个特定值会触发我的 FileException
private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions, ArrayList<String> columnsName) throws FileException {
for (ColumnDefinition cd : columnsDefinitions) {
if(!columnsName.contains(cd.getFieldNameInFile())) {
throw new FileException("Parameter "+cd.getFieldNameInFile() +" missing ");
}
}
}
正如我们在调试器中看到的那样,我的值存在于列表中,它可能与编码有关吗?它适用于其他值,但不适用于这个特定的值。
我知道 contains() 像 equals() 一样工作,所以这里有什么问题
如果我查看单个字符:
cd.getFieldNameInFile() : [90, 66, 75, 80, 70, 45, 66, 85, 75, 82, 83]
columnsName[0] : [-1, -2, 90, 0, 66, 0, 75, 0, 80, 0, 70, 0, 45, 0, 66, 0, 85, 0, 75, 0 , 82, 0, 83, 0]
如何解决这种差异,原因是什么?
【问题讨论】:
-
根据文档,“返回
true当且仅当此列表包含至少一个元素 e 使得(o==null ? e==null : o.equals(e))。”您确定返回的表达式没有尾随空格吗? -
您在比较相同的数据类型吗?如果将 ColumnDefinition 与 String 进行比较,它们永远不会相等(检查 equals 协定),但调试器将使用它们的
toString方法来显示值,因此它们看起来相等。 -
列名可能来自带有 BOM 的文件(Windows?UTF-8/UTF-16 编码) - 可能您只需要更改该值的读取/(但因为我们没有 minimal reproducible example这只是一个疯狂的猜测)
-
@KevinCruijssen 不,这绝对是 UTF-16 ; 2 个第一个字节是 FF FE(BOM - 字节顺序标记);每个字符后跟 2 个字节(因为 ASCII 高阶为零)
-
可能与stackoverflow.com/a/57726475/85421 类似的问题,即文件以UTF-8 BOM 开头(我只是想知道
equals没有正确处理这个问题,可能是因为读取错误的字符集......)