[友情提示]<?xml:namespace prefix = o />
首先你需要告诉大家,测试的真机是哪一款手机,比如Nokia6600,据我所观察,好像这种错误在Nokia6600上发生的比较多;
其次,你可以通过代码调试得知发生此错误的时候,你的代码在做哪方面的执行,比如HttpConnection联网?比如用Graphics的DrawRegion?还是在关闭整个应用程序的时候?
我们总结一下:
[When]
Nokia的几款机器,用了Monty/Monte Virtual Machine。
MontyThread的错误,一般是VM报告的错误,我们猜测当时VM正准备关闭一个或多个正处于活动状态的Thread。
所以有时候你看到应用程序MIDlet被关闭后,隔了一小会儿,突然报告一个MontyThread的错误,这可能是因为你的某一个线程处于阻塞状态,而正在被试图强行关闭。
另外一种情况是,使用JSR135(Mobile Media API[MMAPI])并用错误的编码器在错误的音频流上,也会导致MontyThread异常错误。
[HowTo]
你知道那句名言的,J2ME的那句,“write once, debug everywhere”。
So,尽量在真机上用Alert来反复进行二分法测试,寻找到异常是从哪里抛出来的。
尽量确定你自己创建的线程能否自己优雅地结束,而不需要VM强制关闭。
[参考]
实际上,您可以在《WhatJavaDevelopersNeedToKnow,Symbian OS v7 - Functional description》找到一个相关的错误解释:
Program MontyThread -8
Reason code KERN-EXEC
Reason number 3
In this case the Panic originates from “MontyThread”3 which is the VM thread with identifier 8. The Panic has been detected by the Kernel Executive, which has terminated the associated process. The reason for the Panic is indicated by the number 3. In this example to quote the SDK documentation “This panic is raised when an unhandled exception occurs. Exceptions have many causes, but the most common are access violations caused, for example, by dereferencing a NULL pointer. Among other possible causes are: general protection faults, executing an invalid instruction, alignment checks, etc.”
但是至于更常见的MotyThread -9和-6,则没有解释。
我们尝试在《Error Resolution on Symbian OS》中找到相应的错误,比如
KErrBadHandle | -8 | "Bad object" |
也许和上面所说的“access violations caused”似乎有点像。当然这仅仅是猜测,SymbianOS的错误号可能和MontyThread后面跟的错误号意思不一样。
不管怎么样,我们试图把二者联系到一起:
KErrOverflow | -9 | "Overflow" |
,如果你看到MontyThread -9的错误,会不会是因为你的程序占用了过多的内存?
KErrArgument | -6 | "Bad request" |
,如果你看到MontyThread -6的错误,会不会是因为你的程序用了platformRequest来调用真机上不支持的功能了呢?