前几天刚发现一个
自我感觉比较怪异的问题,今天又碰到一个问题。
快下班的时候经理走到我的工位边上,扫了一下我的屏幕(当时我正在为了周末不加班而努力coding),然后很镇定地对我问我:你这个问题快完了吧? 我赶紧回答:是啊,马上了。(搞定了就能下班了哇,心中暗喜,以为有什么好事) 。 “那好吧,再给你一个问题,你去把这个xx问题解决一下,中间省去若干xx问题的描述,哦,对了,这个问题尽快解决啊,今天弄完,周末就不用加班了”。 我顿时感觉被xx了一下,故作清醒之后,不得不应声:哦。行吧。没问题,我尽快解决。 于是我看着经理离去的背影,怀着xx的心情来解决这个问题。
幸好,老天还算有眼,让我能过一个好点得周末,跟了快两个小时的bug,锁定了问题代码,并且稀里糊涂得解决了。
一些过程和结果是这样的:
xx问题是这个程序不能在一些手机和wtk模拟器上工作。在手机上不能跟bug,因为根本打印不出来日志。程序运行在模拟器上时,会抛出一个系统错误(windows错误对话框那种弹出来),告知我zayit.exe发生错误,然后模拟器崩溃退出。错误画面:
查看错误的其它信息:
我启动debugger进行调试,一步一步确定问题位置,最后发现,问题出在下面一段代码上(List 1):
public class Conversation{
private String mId = "";
public Conversation(){
synchronized(mId){
mId = String.valueOf(System.currentMilliSenconds());
}
try{
Thread.sleep(50); //线程休眠50,是防止有些手机忽略了很短得System.currentMilliSenconds()间隔,导致mId重复,因为可能会在很短时间内创建多个这个类的实例,且要保证mId唯一
}
catch(InterruptException e)
{
// do something
}
}
}
发现问题在这里之后,我尝试修改这段代码。我将构造器改造成这样(List 2):
public Conversation(){
mId = String.valueOf(System.currentMilliSenconds());
然后编译运行,yes, 在wtk模拟器上能工作了。但是我仍旧不知道为什么。
于是我又对代码进行了修改,这次得代码跟List 1中的代码基本是一致的,只修改了一下部分(List 3)
private String mId = new String();
然后编译运行,依然可以在模拟器上运行,可是我还是不知道为什么。
并且修改之后,在之前那些不能运行的手机上也能运行了。另外一点是,原始的代码在KEmulator上运行正常,看来KE的兼容性还真很好,不过做兼容的程序兼容性太好也不见得是啥好事啊
。
后来仔细考虑了一下,这个synchronize块的确是错误的,是不应该有的,因为即使同时创建多个对象而导致mId产生竞争,那就让竞争着去吧,而不是导致抛出系统级的错误并且模拟器异常退出。所以有点怀疑是String类内部引用分配导致这个问题。
不知道大家有什么看法?
分享到:
相关推荐
WTK2.2 J2ME J2ME WTK2.2WTK2.2 J2ME J2ME WTK2.2WTK2.2 J2ME J2ME WTK2.2
J2ME_WTK2.2配置,J2ME,WTK2.2,J2ME开发配置
Eclipse 配置J2ME环境和 WTK2.5.2下载,帮助学习j2me
KEmulator 手机游戏模拟器 这是一个中文界面的 手游模拟器 j2me开发中少不了每天跟各种各样的模拟器打交道,什么sun的wtk模拟器,nokia的模拟器,sonyericsson的模拟器,所有都在这里
kmulate 模拟器个人认为很好用的一款模拟器,特发上来共享。。顺便赚点分。。
使用这个可以模拟j2ME的环境。但模拟器是不可以调试的,很遗憾!
这个是J2ME的基于WTK下的一个手机设计游戏,对于自身能控制自己的飞机,然后击落敌机,敌机具有自动发子弹的能力。拥有良好的界面,由于自己的初学者,里面的很多代码注释比较详细。
J2ME相關遊戲開發 - 五子棋遊戲(人工AI邏輯判斷) 開發環境介紹: Eclipse_SDK_3.2.1、WTK 2.5 遊戲介紹:擁有AI判斷,並且有活四、活三及無限悔棋和音效的功能! PS:嚴禁做非法發放及商業用途! 參考書藉:J2ME ...
J2ME+WTK1.0,wtk1.0,需要jdk1.41支持。用于基于J2ME的手机游戏开发。
j2me程序打包出jar过大时,可以用该模拟器运行,可以调模拟器的分辨率,超级好用
J2ME-Loader Android application which runs J2ME apps http://4pda.ru/forum/index.php?showtopic=824201
模拟运行java软件 KEMulator Lite 0.9.8 可导入java手机(比如塞班)上用的软件 直接把jar格式的文件拖动到窗口即可运行 需要用管理员身份运行
j2me模拟器
GVmaker1.0模拟器J2ME版的Netbeans工程文件 博文链接:https://eastsun.iteye.com/blog/226840
模拟2007手机qq 打开里面2007的jar 即可登陆
本贪吃蛇设计是在前人的基础上加了分级障碍物,开始结束声音(本拟在每级过关时加声音因未找到足够声音而作罢),以及长按键使蛇体加速前进等功能。并对按键响应事件代码进行了部分优化。有兴趣的童鞋可以下载参考...
打开里面的qq_2007.jar文件即可登录,模拟2007手机qq,欢迎下载
j2me(java游戏模拟器) 最新版1.7.5_018_23304.exe
j2me wtk 手机 java环境 如何安装、教程,内容详细,按照着来做一定能成功。
在j2me的开发中,在整个的程序完成并打包后,就可以进行测试了,这就需要一个模拟手机的手机模拟器。