Java:HashMap包含skey返回值错误

Java:HashMap包含skey返回值错误,java,eclipse,Java,Eclipse,我在使用Eclipse4.7.2的HashMap中发现了一个奇怪的行为 下面这行对我来说似乎是正确的: infos.containsKey("desc") ? stmt.setString(8, infos.get("desc")) : stmt.setString(8, "No description"); infos是HashMap的类型,PreparedStatement应该用映射中description(desc)字段的值填充 但Eclipse并不是只执行写在那里的操作,而是指出这行

我在使用Eclipse4.7.2的HashMap中发现了一个奇怪的行为

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

infos.containsKey("desc") ? stmt.setString(8, infos.get("desc")) : 
stmt.setString(8, "No description");
infos
HashMap
的类型,
PreparedStatement
应该用映射中description(
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
系统的功能是什么?操作员相当清楚,但行为不清楚

有人能告诉我哪里错了,或者如何避免这个错误吗


谢谢大家!

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

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

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

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

PreparedStatement.setString
方法返回void

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

正如其他地方指出的,您应该使用传统的if。。。else语句,或者这样写:

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

PreparedStatement.setString
方法返回void

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

正如其他地方指出的,您应该使用传统的if。。。else语句,或者这样写:

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

问题是条件运算符
布尔?value1:value2
需要值,但返回表示缺少任何值的
void

更简单的解决方案是使用Java8提供的

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

问题是条件运算符
布尔?value1:value2
需要值,但返回表示缺少任何值的
void

更简单的解决方案是使用Java8提供的

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

三元运算符中的第二个或第三个操作数表达式调用void方法是编译时错误。更多你可以在这里读到

你可以这样用

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

三元运算符中的第二个或第三个操作数表达式调用void方法是编译时错误。更多你可以在这里读到

你可以这样用

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

为什么不
stmt.setString(8,infos.containsKey(“desc”)?infos.get(“desc”):“无描述”)?@EpicPandaForce谢谢,在我的评论中我也是这样做的:-d区别在于后一个三元“返回”一个字符串,该字符串没有分配给任何变量,但可以分配。您的原始版本将“return”
void
,无法分配,因此不受支持。从:
中,第二个或第三个操作数表达式调用void方法是编译时错误。
为什么不
stmt.setString(8,infos.containsKey(“desc”)?infos.get(“desc”):“无描述”)?@EpicPandaForce谢谢,在我的评论中我也是这样做的:-d区别在于后一个三元“返回”一个字符串,该字符串没有分配给任何变量,但可以分配。您的原始版本将“return”
void
,无法分配,因此不受支持。从:
中,第二个或第三个操作数表达式调用void方法是编译时错误。