IllegalArgumentException:错误信息没有意义



我正在尝试调试一个依赖于反射的Java应用程序。现在我得到的错误如下:

java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:38)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:18)
    at java.lang.reflect.Field.get(Field.java:358)

应用程序运行的最后一行是:

Field f = classUnderTest.getDeclaredField(processFieldName(var));
f.setAccessible(true);
Long value = (Long) f.get(runtimeInstance);

错误信息有点误导,我不确定为什么它提到set操作,而我正在尝试执行get

我怀疑runtimeInstance不是预期类的对象。但是那个错误信息把我扔了。

以前有人遇到过这个问题吗?有线索吗?

PS1:引起异常的确切行是这一行:

Long value = (Long) f.get(runtimeInstance);

PS2: processFieldName(var)处理字段的正确名称,即从具有字段名称的字符串中删除一些工件,如this.等。

从这些访问器的来源来看,声明字段的类似乎不能从runtimeInstance的类中分配:

如果(

! (this.field.getDeclaringClass () .isAssignableFrom (paramObject.getClass ())))
,throwSetIllegalArgumentException (paramObject);

field似乎是您想要从实例中获得的字段,paramObject是您的runtimeInstance

因此,如果字段的声明类不是paramObject的类或超类,您将得到该消息。

你的paramObject有可能是Integer吗?

编辑:这里有一些来自OpenJDK的源代码(应该类似于Oracle的),来解释这个消息:

  protected String getSetMessage(String attemptedType, String attemptedValue) {
         String err = "Can not set";
         if (Modifier.isStatic(field.getModifiers()))
             err += " static";
         if (isFinal)
             err += " final";
         err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to ";
         if (attemptedValue.length() > 0) {
             err += "(" + attemptedType + ")" + attemptedValue;
         } else {
             if (attemptedType.length() > 0)
                 err += attemptedType;
             else
                 err += "null value";
         }
         return err;
     }

记下你的留言java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer我们发现:

  • 字段类型为int
  • 字段名是DataStructures.StackAr类中的topOfStack
  • attemptedType is java.lang.Integer

由于attemptedType是您的runtimeInstance的类型,我怀疑classUnderTestDataStructures.StackAr,而runtimeInstancejava.lang.Integer的类型。

您在堆栈顶部获得的错误的java源代码似乎表明rununtimeinstance与classUnderTest不是同一个类:

protected void ensureObj(Object o) {
                 // NOTE: will throw NullPointerException, as specified, if o is null
                if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) {
                     throwSetIllegalArgumentException(o);
                 }
             }

仔细阅读错误信息:"Can not set int字段DataStructures.StackAr.topOfStack to java.lang.Integer"

您需要在分配Integer之前将其更改为int

相关内容

  • 没有找到相关文章

最新更新