【问题标题】:Dealing with null-to-string errors处理空字符串错误
【发布时间】:2013-06-01 06:25:29
【问题描述】:

我正在检索一个对象并将其转换为字符串。 .get() 可能会返回 null,这反过来会在尝试转换为字符串时崩溃。在这种情况下处理 null 的最佳方法是什么?如果它返回 null,则可能将其设置为空字符串。我试图避免为每个 .get() 编写 if 语句

 String value1 = userDict.get("key1").toString();
 String value2 = userDict.get("key2").toString();
 String value3 = userDict.get("key3").toString();
 String value4 = userDict.get("key4").toString();

编辑:

userDict 是 HashMap(字符串,对象)

【问题讨论】:

  • 如果.get()方法返回null,你希望返回什么?
  • public String getDictEntry(String key) { Object value = userDict.get(key); if (value == null) { return ""; } return value.toString(); }
  • userDict 是什么类型?如果您可以将其放入Properties,那么您可以使用默认值调用适当的get() 方法。
  • 你可以用这一行写一个静态实用方法 - return obj == null ? "" : obj.toString();
  • userDict 是 HashMap (String, Object)

标签: java string null


【解决方案1】:

尝试使用String.valueOf(userDict.get("key1"))。根据the specsvalueOf(Object o),它要么在对象上调用toString(),要么返回字符串"null",如果给定一个空对象。

编辑:编辑为指向 java 7 api 而不是 java 6 api。

编辑 2:如果您不介意让代码更密集,您可以使用 ternary operator 封装此方法的逻辑:

String value1 = (userDict.get("key1") == null) ? "" : userDict.get("key1").toString();

【讨论】:

  • 我从来没有见过需要在某处存储或打印“null”的用例。
  • 是的,但是如果没有适当的用例,这似乎是一个很好的起点。如果给定null,则可以轻松编写此方法的自定义版本,以提供更多帮助。
  • 是的,打印 null 不会飞
  • 那么看起来您将不得不编写一个辅助方法,该方法接受一个 Object 并返回 "" 如果 Object 是 nullo.toString() 如果不是。这与 String.valueOf(Object o) 所做的非常相似(当然,除了你会返回 "" 而不是 "null")。
  • @ono 如果你不能拥有"null",你想让它做什么?
【解决方案2】:

如果返回null,可能将其设置为空字符串。

这取决于你。这取决于这段代码的目的是什么。

我试图避免为每个 .get() 编写 if 语句

如果你想避免重复代码,那就给自己写一个辅助方法。

【讨论】:

  • @ono:我所说的“帮手”,实际上只是指一种两行的小方法,它排除了您必须复制和粘贴 N 次的常见逻辑。
【解决方案3】:

按照 Oli 的建议,您可以创建一个如下所示的辅助获取方法

String helperGet(String key){
    YourClassType t = userDict.get("key1");
    if(t!=null)
       return t.toString();
    else
       return "";
}

现在像下面这样调用

 String value1 = userDict.helperGet("key1");
 String value2 = userDict.helperGet("key2");
 String value3 = userDict.helperGet("key3");
 String value4 = userDict.helperGet("key4");

【讨论】:

    【解决方案4】:

    我会使用辅助方法。像这样的东西应该可以工作..

    protected String getStringFromMap(Map<String,Object> map, String key)
    {
       Object value = map.get(key);
       return value != null ? value.toString() : "";
    }
    

    那么你可以这样称呼它:

    String value1 = getStringFromMap(userDict, "key1");
    String value2 = getStringFromMap(userDict, "key2");
    String value3 = getStringFromMap(userDict, "key3");
    String value4 = getStringFromMap(userDict, "key4");
    

    【讨论】:

      【解决方案5】:

      我会使用 try-catch

        try {
          value1 = userDict.get("key1").toString();
        } catch (Exception e) {
          value1 = 0;
        }
      

      【讨论】:

      • 这是一个非常糟糕的主意。一方面,对 null 的测试更容易。此外,您可以通过这种方式捕获所有未检查的异常。
      • 如果有多个变量:value1、value2、value3,你怎么知道catch里面要设置哪个变量?
      猜你喜欢
      • 2015-01-21
      • 1970-01-01
      • 2014-07-23
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2017-08-06
      相关资源
      最近更新 更多