Duplicate :
|
FULL PRODUCT VERSION : java version "1.5.0_06" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows XP [Version 5.1.2600] (actually, not OS-specific) A DESCRIPTION OF THE PROBLEM : javac generates incorrect code with "-source 1.4 -target 1.4" for StringBuffer.append(CharSequence). In the "real" 1.4, it would generate a call to StringBuffer.append(Object), whereas using the 1.5 JDK, even at -source 1.4, it blindly generates a call to the (new in 1.5) StringBuffer.append(CharSequence). When this object is later run with a "real" 1.4 JRE, I get a NoSuchMethodError. STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : 1. Compile the following source using the 5.0 JDK with -source 1.4 -target 1.4: class foo { public static void main(String[] args) { String line = "abcd"; StringBuffer sb = new StringBuffer(); sb.append(line.subSequence(0, 2)); System.out.println(sb.toString()); } } 2. Run this code using a ***1.4*** Javac: C:\> c:\java\bin\java -version java version "1.4.2_08" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03) Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode) c:\> c:\java\bin\java foo Exception in thread "main" java.lang.NoSuchMethodError: java.lang.StringBuffer.append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer; at foo.main(foo.java:7) EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Expected result is that it prints out the line ab ACTUAL - Runtime error ERROR MESSAGES/STACK TRACES THAT OCCUR : Exception in thread "main" java.lang.NoSuchMethodError: java.lang.StringBuffer.append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer; at foo.main(foo.java:7) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- See "steps to reproduce" ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : The workaround (source code only!) is to use substring() instead of subsequence() in the call.