Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jython: test to prevent exception "Cannot create PyString with non-byte value"?

Jython 2.7.0 (final release). OS: W7 (64-bit)

this code:

keys = javax.swing.UIManager.getDefaults().keys()
while keys.hasMoreElements():
    key = keys.nextElement()
    logger.info( "=== key %s" % str( key ) )
    try:  
        value = javax.swing.UIManager.get(key)
    except java.lang.Throwable, t:
        logger.error( "=== thrown %s" % str( t ) )

produces all sorts of keys... until it outputs

=== key PasswordField.echoChar

it then throws

java.lang.IllegalArgumentException: Cannot create PyString with non-byte value

I'm aware this is a known bug in Jython ... just wondering if there is a way of testing for this before the exception is thrown?

like image 721
mike rodent Avatar asked Jun 17 '26 08:06

mike rodent


2 Answers

For me this gets triggered when using print() directly on a Java HashMap that contains any value with a Unicode character. A simple Python version of isBytes from PyString class is one way to detect it, but frankly, I don't think that is a good option unless you (a) know what element of the data that is triggering the issue and/or (b) intend to mask or fix the values triggering the issue. Probably the best solution is to just catch the exception.

This definitely effects Jython >= 2.7 and is a very annoying bug when troubleshooting. For me I just commented out the IllegalArgumentException in the PyString class code and recompiled. Now Jython will happily print out HashMaps directly and replace the Unicode characters with ? just like it did in previous versions. I would guess that this causes issues somewhere, maybe with code dealing with a lot of Unicode or something, but I haven't found any issues as of yet.

Catch Exception:

from java.lang import IllegalArgumentException

keys = javax.swing.UIManager.getDefaults().keys()
while keys.hasMoreElements():
    key = keys.nextElement()
    logger.info( "=== key %s" % str( key ) )
    try:
        value = javax.swing.UIManager.get(key)
    except java.lang.Throwable, t:
        try:
            logger.error( "=== thrown %s" % str( t ) )
        except IllegalArgumentException:
            # fix it or w/e

Python version of isBytes:

def test_if_char(value):
    for e in value:
        if ord(e) > 255: return False
    return True
like image 92
jorb Avatar answered Jun 21 '26 01:06

jorb


In case you use Jython 2.7.0, one could use the following code to use any of Unicode strings within your code:

PyString str = Py.newStringOrUnicode("颜军")
like image 41
hdk Avatar answered Jun 21 '26 01:06

hdk



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!