RFR: 8298065: Provide more information in message of NoSuchFieldError [v4]

Ioi Lam iklam at openjdk.org
Thu Dec 22 21:00:49 UTC 2022


On Thu, 22 Dec 2022 19:35:22 GMT, Matias Saavedra Silva <matsaave at openjdk.org> wrote:

>> A java.lang.NoSuchFieldError is typically thrown when you remove a field but do not recompile the client code that calls the field. However, the message does not indicate in which class the field was not found. 
>> 
>> Additionally, java.lang.NoSuchFieldError is thrown if the field is still present but the types are incompatible. For example, if a field is first defined as int, and later changed to long without recompiling the client. The error text has been expanded to include the class name and field type. Verified with tier 1-4 tests.
>> 
>> Old output:
>> `Exception in thread "main" java.lang.NoSuchFieldError: x
>>         at NoSuchFieldMain.main(NoSuchFieldMain.java:3)`
>> Example output:
>> `Exception in thread "main" java.lang.NoSuchFieldError: Class Other does not have field 'int x'
>>         at NoSuchFieldMain.main(NoSuchFieldMain.java:3)`
>> 
>> The added test considers different types of fields like primitives, arrays, and references.
>
> Matias Saavedra Silva has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Improved style and cleanup

We shouldn't rebuild the test three times, replacing the binaries of a classfile each time. This makes it difficult to run the test stand-alone.

Instead, the test should be written with three separate .jasm files like this:


super public class NoSuchFieldA
	version 63:0
{
  // REMOVED static Field staticFieldA:I;

  public Method "<init>":"()V"
	stack 1 locals 1
  {
		aload_0;
		invokespecial	Method java/lang/Object."<init>":"()V";
                iconst_0;
                putstatic	Field staticField:"I"; // This will throw NoSuchFieldError
		return;
  }
}


and the main test java file can do this:


    try {
        Class.forName("NoSuchFieldA").newInstance();
    } catch (NoSuchFieldError e) {
        ....
    }


This way, you can just build the test once. After the test finishes, you can rerun the manually by using the .class files from jtreg's output directory.

-------------

PR: https://git.openjdk.org/jdk/pull/11745


More information about the hotspot-runtime-dev mailing list