Java:HashMap 包含键返回值错误



我在使用 Eclipse 4.7.2 的 HashMap 中发现了一种奇怪的行为。

以下行对我来说似乎是正确的:

infos.containsKey("desc") ? stmt.setString(8, infos.get("desc")) : 
stmt.setString(8, "No description");

infosHashMap<String, String>类型,PreparedStatement应填充地图中描述 (desc( 字段的值。

但是,Eclipse 不是只执行那里所写的内容,而是指示此行中存在多个错误:

 infos.containsKey**("desc")** ? stmt.setString(8, infos.get("desc")) :
 stmt.setString(8, "No description"**)**;

我标记了 Eclipse 中带下划线的字符。

错误消息是:

Multiple markers at this line
    - Syntax error on token ")", delete this token
    - Syntax error, insert ")" to complete Expression
    - Type mismatch: cannot convert from String to 
     boolean

?操作器的功能相当明确,但行为不清楚。

有没有人可以告诉我我错在哪里或如何消除此错误。

谢谢!

问题是条件运算符boolean ? value1 : value2期望值,但stmt.setString返回表示缺少任何值的void

更简单的解决方案是使用 Java 8 中提供的Map#getOrDefault(key, defaultValue),例如

stmt.setString(8, infos.getOrDefault("desc", "No description"));

PreparedStatement.setString 方法返回 void。

三元运算符的目的是返回一个值或另一个值。因此,不能使用返回 void 的表达式。此外,两个表达式必须返回相同类型的值。

如其他地方所示,您应该使用传统的 if ...else 语句,或者这样写:

stmt.setString(8, infos.containsKey("desc") ? infos.get("desc") : "No description")

将代码转换为传统if...else而不是三元运算符

if(infos.containsKey("desc"))
   stmt.setString(8, infos.get("desc"));
else
   stmt.setString(8, "No description");
对于

第二个或第三个操作数表达式作为 void 方法的调用,这是三元运算符中的编译时错误。您可以在此处阅读更多相关信息

Java 条件运算符

你可以这样使用。

 String str = infos.containsKey("desc") ?  infos.get("desc") : "No description";
 stmt.setString(8, str);

最新更新