The following valid code raises a verify error:
The code above will throw an ArrayStoreException at runtime but the generated bytecode is valid.
The Java Virtual Machine Specification Second Edition is ambigous about this kind of issue. It states in §4.8.2 Structural Constraints (http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#9308):
The type of every value stored into an array of type reference by an aastore instruction must be assignment compatible (§2.6.7) with the component type of the array.
But in the aastore opcode description, there is no reference to any kind of linking or verification error. The assignment compatiblity error is a runtime exception.
In the Java SE 7 Edition of _The Java Virtual Machine Specification, the §4 has been modified (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.2):
The type of every value stored into an array by an aastore instruction must be a reference type.
The component type of the array being stored into by the aastore instruction must also be a reference type.
The assignment compatibility check must not be done during the verification of the bytecode but during its execution.