前几天刚发现一个
自我感觉比较怪异的问题,今天又碰到一个问题。
快下班的时候经理走到我的工位边上,扫了一下我的屏幕(当时我正在为了周末不加班而努力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类内部引用分配导致这个问题。
不知道大家有什么看法?
分享到:
相关推荐
J2ME(Java 2 Platform, Micro Edition)是Java平台的一个重要分支,主要用于开发和部署在移动设备、嵌入式设备以及消费电子设备上的应用程序。它为这些资源有限但又需要强大计算能力的设备提供了Java编程环境。J2ME...
通过分析和理解这个J2ME手机蓝牙五子棋游戏的源代码,开发者可以学习到如何在有限的资源环境下构建一个完整的游戏应用,以及如何利用J2ME的特性和API实现游戏的核心功能。对于初学者来说,这是一个极好的实践项目,...
- **定义**:J2ME 是 Java 平台的一个版本,专门设计用于移动设备、嵌入式设备和其他资源受限的环境。 - **组成部分**:J2ME 包括两个主要部分 - 配置(Configuration) 和剖面(Profile),其中配置提供了基本的运行...
J2ME 游戏开发通常需要一个集成开发环境(IDE),如 NetBeans 或 Eclipse,以及相应的 J2ME 插件。这些工具提供代码编辑、编译、模拟器测试等功能,帮助开发者构建和调试应用程序。 二、配置文件 J2ME 游戏的核心...
WTK 2.5.2是针对J2ME的一个版本,可以用来模拟不同类型的移动设备环境。 4. **安装Proguard 3.3.1:** Proguard是一个用于优化和混淆Java字节码的工具,它可以减少代码大小并提高性能。在J2ME开发中,使用Proguard...
选择一个J2ME模拟器,比如WTK的手机模拟器,然后运行项目。在模拟器上,你将看到一个简单的表单,输入两个数字后,点击屏幕上的“OK”按钮,可以看到两个数字的和。 通过以上步骤,你已经在NetBeans IDE中成功实现...
7. **错误处理和优化**:优秀的源码会包含适当的错误处理机制,如异常捕获,以确保程序在遇到问题时能够优雅地退出。此外,由于J2ME运行在资源受限的设备上,优化代码以减少内存消耗和提高性能是至关重要的。 8. **...
- **MIDlet**:在J2ME中,应用程序被称为MIDlet,它由一个主类(通常继承自`javax.microedition.midlet.MIDlet`)和其他辅助类组成。 2. **MIDP组件:** - **用户界面**:MIDP提供了一个简单的用户界面框架,包括...
综合运用前面所学,设计一个完整的J2ME应用程序,提升实际问题解决能力。 **实验工具与环境** - J2ME Wireless Toolkit:J2ME开发的主要工具,包含模拟器和编译器。 - Java源代码开发工具:如Eclipse或Jcreator,...
【标题】"对j2me say hello" 是一个基础的J2ME(Java 2 Micro Edition)编程示例,用于向开发者介绍如何在这一平台上创建简单的应用程序。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的手机和...
Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于开发在资源有限的设备上运行的应用程序,如移动电话、智能家电、嵌入式系统等。对于初学者来说,理解J2ME的基本概念和实践技巧是至关重要的。以下是一份...
WTK是Sun Microsystems提供的一个开源开发工具,包含了MIDP和CLDC的模拟器,以及编译和调试J2ME应用程序所需的工具。 7. **MIDlet生命周期** MIDlets有特定的生命周期,包括启动、暂停、恢复和退出四个阶段。...
Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式系统和移动设备,如手机、PDA、智能家电等。J2ME为开发这些设备上的应用程序提供了统一的框架和编程模型。在J2ME开发中,我们需要了解以下几个...
J2ME应用程序通常由一个主类(MIDlet)构成,该类继承自`javax.microedition.midlet.MIDlet`。MIDlet管理应用程序的生命周期,包括启动、暂停、恢复和退出。 6. **用户界面(UI)设计** J2ME中的UI设计主要基于 ...
1. **Java基础知识**:J2ME是Java的一个子集,因此首先需要掌握Java语言的基础,包括类、对象、接口、异常处理、数据类型、控制结构等。 2. **J2ME架构**:理解MIDP(Mobile Information Device Profile)和CLDC...
J2ME无线工具包(Wireless Toolkit,简称WTK)是Java开发者进行移动应用程序开发的重要平台,尤其对于那些致力于创建Java Micro Edition(J2ME)应用的程序员而言,WTK是一个不可或缺的工具。本文将深入探讨WTK的...
J2ME平台是Java平台的一个分支,专门针对资源受限的设备。它由配置(Configuration)和剖面(Profile)两部分组成,配置定义了运行时环境的基本功能集,而剖面则定义了特定类型的应用程序(例如移动设备上的游戏或...
7. **设备库**:提供了一个设备数据库,包含了各种J2ME支持设备的配置信息,开发者可以根据目标设备选择合适的配置。 8. **WTK集成**:EclipseME能够与Sun Microsystems的Java Wireless Toolkit (WTK)无缝集成,...
J2ME(Java 2 Micro Edition)作为Java平台的一个版本,主要用于资源受限的设备,如手机、PDA等。为了能够开发和测试J2ME应用程序,首先需要配置开发环境。这通常包括安装JDK(Java Development Kit)、J2ME SDK...
Wireless Toolkit(WTK)是Sun Microsystems提供的模拟器,用于测试和调试J2ME(Java 2 Micro Edition)应用程序。J2ME是Java平台的一个子集,专为资源有限的嵌入式设备,如手机和PDA,设计。它包含了CLDC...