[kaffe] java.lang.ClassCastException

Lam King Tin ktlam at cs.hku.hk
Sat Dec 16 04:07:52 PST 2006


Dear Jim,

Thank you very much for your reply. 

I have tried to replace the method with the fixed version from Connector/J 5.0 
as follows. The casting exception has disappeared. However, now I always 
encounter below. This encoding should be the most common, right? But why this 
happens. Thanks.

SQL Exception:  Unsupported character encoding 'ISO8859_1'.

Best regards,
King Tin


//J2.1-fix start: Partially sync fixed method from Connector/J 5.0
	SingleByteCharsetConverter getCharsetConverter(
			String javaEncodingName) //throws SQLException {
    	{
		if (javaEncodingName == null) {
			return null;
		}

		/*if (this.usePlatformCharsetConverters) {
			return null; // we'll use Java's built-in routines for 
this
			             // they're finally fast enough
		}*/
		
		SingleByteCharsetConverter converter = null;
		
		synchronized (this.charsetConverterMap) {
			Object asObject = this.charsetConverterMap
			.get(javaEncodingName);

			if (asObject == 
CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
				return null;
			}
			
			converter = (SingleByteCharsetConverter)asObject;
			
			if (converter == null) {
				try {
					converter = 
SingleByteCharsetConverter.getInstance(
							javaEncodingName);
	//, this);

					if (converter == null) {
						this.charsetConverterMap.put
(javaEncodingName,
							
	CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
					} else {
						this.charsetConverterMap.put
(javaEncodingName, converter);
					}
				} catch (UnsupportedEncodingException 
unsupEncEx) {
					this.charsetConverterMap.put
(javaEncodingName,
						
	CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);

					converter = null;
				}
			}
		}

		return converter;
	}
//J2.1-fix end: Sync fixed method from Connector/J 5.0
 





Quoting Jim White <jim at pagesmiths.com>:

> Lam King Tin wrote:
> 
> > ...
> > SingleByteCharsetConverter converter = (SingleByteCharsetConverter) 
> > this.charsetConverterMap.get(javaEncodingName);
> > 
> > Do you know what's the reason of the casting exception and any manageable 
> > solution? Thank you very much.
> > 
> > Best regards,
> > King Tin
> >  
> > SQL Exception:  Unable to connect to any hosts due to exception: 
> > java.lang.ClassCastException: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> > 
> > ** BEGIN NESTED EXCEPTION ** 
> > 
> > java.lang.ClassCastException
> > MESSAGE: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> > 
> > STACKTRACE:
> > 
> > java.lang.ClassCastException: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> >         at
> com.mysql.jdbc.Connection.getCharsetConverter(Connection.java:2046)
> 
> I don't know much about Kaffe, but the message makes clear that 
> something odd has happened.  Someone has put a plain "java.lang.Object" 
> into the converter map under the encoding you're trying to use.  It 
> would seem to make a lot more sense that the encoding is missing than 
> there would be an illegal object.
> 
> It would probably be helpful to know which character encoding you're using.
> 
> http://dev.mysql.com/downloads/connector/j/3.0.html
> 
> mysql-connector-java-3.0.17-ga/com/mysql/jdbc/Connection.java
> 
> Okay, I did a little (okay, a lot) more digging.  Here's the relevant 
> source:
> 
>      /**
>       * Marker for character set converter not being available (not written,
>       * multibyte, etc)  Used to prevent multiple instantiation requests.
>       */
>      private final static Object CHARSET_CONVERTER_NOT_AVAILABLE_MARKER 
> = new Object();
> 
> ....
> 
>      synchronized SingleByteCharsetConverter getCharsetConverter(
>          String javaEncodingName) {
>          SingleByteCharsetConverter converter = 
> (SingleByteCharsetConverter) this.charsetConverterMap
>              .get(javaEncodingName);
> 
>          if (converter == CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
>              return null;
>          }
> 
>          if (converter == null) {
>              try {
> 
> So they intended to detect missing encoding sets, but the logic is 
> broken (the cast will always throw an exception before the test can be 
> made).  You could fix this code so that it returns null as intended on 
> missing converters.  I looked in the source for that same file in 5.0, 
> and the above bug is fixed.  Copy-and-pasting just that method might do 
> the trick.
> 
> http://dev.mysql.com/downloads/connector/j/5.0.html
> 
> 	/**
> 	 * Returns the locally mapped instance of a charset converter (to avoid
> 	 * overhead of static synchronization).
> 	 *
> 	 * @param javaEncodingName
> 	 *            the encoding name to retrieve
> 	 * @return a character converter, or null if one couldn't be mapped.
> 	 */
> 	SingleByteCharsetConverter getCharsetConverter(
> 			String javaEncodingName) throws SQLException {
> 		if (javaEncodingName == null) {
> 			return null;
> 		}
> 
> 		if (this.usePlatformCharsetConverters) {
> 			return null; // we'll use Java's built-in routines for 
this
> 			             // they're finally fast enough
> 		}
> 		
> 		SingleByteCharsetConverter converter = null;
> 		
> 		synchronized (this.charsetConverterMap) {
> 			Object asObject = this.charsetConverterMap
> 			.get(javaEncodingName);
> 
> 			if (asObject == 
CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
> 				return null;
> 			}
> 			
> 			converter = (SingleByteCharsetConverter)asObject;
> 			
> 			if (converter == null) {
> 				try {
> 					converter = 
SingleByteCharsetConverter.getInstance(
> 							javaEncodingName, 
this);
> 
> 					if (converter == null) {
> 						this.charsetConverterMap.put
(javaEncodingName,
> 							
	CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
> 					} else {
> 						this.charsetConverterMap.put
(javaEncodingName, converter);
> 					}
> 				} catch (UnsupportedEncodingException 
unsupEncEx) {
> 					this.charsetConverterMap.put
(javaEncodingName,
> 						
	CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
> 
> 					converter = null;
> 				}
> 			}
> 		}
> 
> 		return converter;
> 	}
> 
> 
> 
> Also setting the character encoding to be one that is supported could 
> help.  If you need an unsupported character encoding then it could be 
> added to Kaffe (probably the most difficult option).
> 
> Jim
> 
> 


-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/




More information about the kaffe mailing list