JakeWharton/butterknife · error · IllegalStateException
@BindBool field type must be 'boolean'. (
Error message
@BindBool field type must be 'boolean'. (
What it means
@BindBool reads a boolean resource with Resources.getBoolean, so parseBindBool requires the field's type to be the primitive boolean. A Boolean (boxed), int, or any other type throws this IllegalStateException at bind time. The compiler flavor enforces the identical rule during annotation processing.
Source
Thrown at butterknife-reflect/src/main/java/butterknife/ButterKnife.java:446
return Unbinder.EMPTY;
}
private static @Nullable Unbinder parseBindBool(Object target, Field field, View source) {
BindBool bindBool = field.getAnnotation(BindBool.class);
if (bindBool == null) {
return null;
}
validateMember(field);
int id = bindBool.value();
Resources resources = source.getContext().getResources();
Object value;
Class<?> fieldType = field.getType();
if (fieldType == boolean.class) {
value = resources.getBoolean(id);
} else {
throw new IllegalStateException("@BindBool field type must be 'boolean'. ("
+ field.getDeclaringClass().getName()
+ '.'
+ field.getName()
+ ')');
}
trySet(field, target, value);
return Unbinder.EMPTY;
}
private static @Nullable Unbinder parseBindColor(Object target, Field field, View source) {
BindColor bindColor = field.getAnnotation(BindColor.class);
if (bindColor == null) {
return null;
}
validateMember(field);
int id = bindColor.value();View on GitHub (pinned to fcdebedf32)
Solutions
- Change the field to primitive boolean: `@BindBool(R.bool.is_tablet) boolean isTablet;`
- In Kotlin, use a non-null `Boolean` property so the backing field is primitive
Example fix
// before @BindBool(R.bool.is_tablet) Boolean isTablet; // boxed // after @BindBool(R.bool.is_tablet) boolean isTablet;
Defensive patterns
Strategy: type-guard
Validate before calling
if (field.getType() != boolean.class) {
throw new IllegalStateException("@BindBool field must be primitive boolean: " + field);
} Type guard
static boolean isPrimitiveBooleanField(Field f) {
return f.getType() == boolean.class;
} Prevention
- Use primitive boolean (not Boolean) for @BindBool fields
- In Kotlin, declare non-null Boolean properties so the backing field stays primitive
When it happens
Trigger: `@BindBool(R.bool.is_tablet) Boolean isTablet;` (boxed wrapper instead of primitive); Kotlin properties whose backing field resolves to Boolean; annotating an int flag field with @BindBool.
Common situations: Kotlin `var isTablet: Boolean = false` with the annotation landing on a boxed context; Java developers using the wrapper type out of habit; nullable boolean fields.
Related errors
- @BindView fields must extend from View or be an interface. (
- @BindViews must be a List or array. (
- @BindViews List or array type must extend from View or be an
- @BindAnim field type must be 'Animation'. (
- @BindArray field type must be one of: String[], int[], CharS
AI-assisted analysis of JakeWharton/butterknife@fcdebedf32 (2026-08-14).
Data as JSON: /api/errors/67d70b1cf4961ca9.
Report an issue: GitHub.