Jython 2.7.0(最终版)。操作系统:W7(64位)
此代码:
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 ) )
生成各种键......直到输出
=== key PasswordField.echoChar
然后抛出
java.lang.IllegalArgumentException:无法创建PyString 非字节值
我知道这是Jython中的一个已知错误...只是想知道在引发异常之前是否有一种测试方法?
答案 0 :(得分:1)
对我来说,直接在包含Unicode字符的任何值的Java HashMap上使用print()
时会触发此操作。一个简单的Python版isBytes
from PyString class是检测它的一种方法,但坦率地说,除非你(a)知道触发问题的数据元素和/,否则我认为这不是一个好选择。或(b)打算掩盖或修正触发该问题的价值。可能最好的解决方案就是捕获异常。
这肯定会影响Jython> = 2.7并且在进行故障排除时是一个非常烦人的错误。对我来说,我只是在PyString
类代码中注释掉IllegalArgumentException并重新编译。现在,Jython将很乐意直接打印出HashMaps,并将{Unicode}字符替换为?
,就像在以前的版本中一样。我猜这会导致问题,可能是代码处理大量的Unicode或其他东西,但我还没有发现任何问题。
捕获例外:
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
isBytes的Python版本:
def test_if_char(value):
for e in value:
if ord(e) > 255: return False
return True
答案 1 :(得分:1)
如果您使用Jython 2.7.0,可以使用以下代码在您的代码中使用任何Unicode字符串:
PyString str = Py.newStringOrUnicode("颜军")