我在使用 Eclipse 4.7.2 的 HashMap 中发现了一种奇怪的行为。
以下行对我来说似乎是正确的:
infos.containsKey("desc") ? stmt.setString(8, infos.get("desc")) :
stmt.setString(8, "No description");
infos
是HashMap<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);