【问题标题】:java.lang.IllegalArgumentException: invalid ObjectId [0]java.lang.IllegalArgumentException:无效的 ObjectId [0]
【发布时间】:2014-05-07 03:29:14
【问题描述】:

当我尝试在我的一个类中执行类似于下面的代码时,我得到一个 java.lang.IllegalArgumentException: invalid ObjectId [0]。

    String s = "0_abc";
--------
private ObjectId obj; [Instance variable]
public NewClass(String s){
    String[] sarray = s.split("_");
    obj = new ObjectId(sarray[0]);
}

失败的可能原因是什么?

【问题讨论】:

  • 那是无效的语法......你想用你的第三行做什么?如果要使用 sarray 的第 0 个元素创建新的 ObjectID,则需要使用普通括号,而不是大括号。 IE。 (和)
  • 哎呀...对不起!改了!
  • 在此处发布您的 ObjectId 类定义 - 之后我们可以为您提供更好的建议
  • 这里,obj 是一个实例变量,s 是传递给类的构造函数的参数,也是设置 obj 的地方。

标签: java bson


【解决方案1】:

我假设 ObjectId 类是 (org.bson.types.ObjectId) 并且在 MongoDB Java 驱动程序中使用。 此异常的意思是“0”不能作为 ObjectId 构造的值传递。

并非每个字符串都是正确的 ObjectId 值。当 ObjectId 用给定的字符串初始化时,验证就完成了。例如 ObjectId 要求字符串有 24 个字符。还有更多的约束,你可以在方法isValid()中找到完整的验证源代码in GitHub repo

如果你想创建一个具有正确值的 ObjectId 对象,你可以使用可用的工厂方法来创建它,如下所示:

ObjectId obj = ObjectId.get()

这将使用自动生成的值创建 ObjectId。

【讨论】:

    【解决方案2】:

    我认为ObjectId obj = new ObjectId{sarray[0]}; 应该是:

    ObjectId obj = new ObjectId(sarray[0]);
    

    【讨论】:

      【解决方案3】:

      不幸的是,您没有发送堆栈跟踪,但我认为异常是从您的类 ObjectId 的构造函数中抛出的,它不允许将 0 作为参数发送。我还认为您想说new ObjectId(sarray[0]) 而不是new ObjectId{sarray[0]};。否则我真的不明白你怎么编译这个。

      【讨论】:

      • 其他情况下参数为0时是否抛出此异常?
      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2016-01-26
      • 2017-11-04
      • 2017-12-13
      相关资源
      最近更新 更多