易错点集合

1.

 

Map<Integer, String> map = new HashMap<Integer, String>();
		map.put(1, "a");
		long l = 1;
		System.out.println(map.get(l));

输出为:null而不是1

2.

 

Integer a = 1;
Integer b = 2;
List<Integer> list = new ArrayList<Integer>();
list.add(a);
list.add(b);
list.remove(2);

IndexOutOfBoundsException:remove(b)就正确了,remove参数是int代表index,而Integer代表Object。

3.

 

int a = 30 * 10000000*1000;
System.out.println(a);

输出:-647710720

 

4.

在更新listView时,若是用new一个新adapter来实现,切记:调用的原adapter与新adapter不是同一个引用。常见问题在于,删除第一个item,再删除第二个item时其实指向的还是第一个item,从而出现了逻辑错误。如 refresh() { adapter = new XXXAdapter(xxx); listview.setAdapter(adapter);},XXXAdapter里面adapter是一个域变量,通过adapter调用方法时,还是原来的adapter而非新new的adapter。

5.

 

public static void main(String[] args) {
		List<String> list = getABC();
		list.add("END");// 完成某个功能:添加一个结束标志
		// 注:这时原封装的方法getABC()就变了!!!!!!!
		System.out.println(getABC().size());// 输入:4
	}
	
	//
	private static List<String> abc;
	public static List<String> getABC() {// 返回abc列表
		if(abc!=null){
			return abc;
		}
		abc = new ArrayList<String>(); 
		abc.add("a");
		abc.add("b");
		abc.add("c");
		return abc;
	}

引用类型变量一定要注意,不然出现意想不到的bug

 

6.

把一个java.util.Date对象存入数据库时,java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

java.util.Date转java.sql.Date时,由于java.sql.Date为了能够遵守sql日期标准,把所有时分秒都归了零;只有年月日,没有了时分秒了。

这时,用TimeStamp就行了。
 

7.

 

List<List<String>> lists = new ArrayList<List<String>>();
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		lists.add(list);
		list.clear();// 方案二:list = new ArrayList<String>();
		System.out.println(lists.size() + "," + lists.get(0).size());


输出:1,0。如果按照注释后面的方案二,则输出1,3。

 

8.

 

public class Test {
	private static Integer i;

	public static void main(String[] args) {
		Test t = new Test();
		t.go(i);
		System.out.println(i);
	}

	public void go(Integer i) {
		i = 3;
	}
}

输出:null
 

9.

 

MediaRecorder mRecorder = new MediaRecorder();
.......
recordFile.mkdir(); // 或recordFile.mkdirs();
mRecorder.setOutputFile(recordFile.getAbsolutePath());

 

异常:EISDIR (Is a directory)

解决:recordFile.createNewFile()

 

10.

 

class X {
    int a;
    setA(int a) {
        this.a = a;
    }
    int getA() {
        return this.a;
    }
}

 

new X().setA(3); 

System.out.print("a=" + new X().getA());

输出:0

 

11.

年会员剩余时间的毫秒数:long ttl = 365 * 24 * 60 * 60 * 1000 - 已花费的时间

错误,因为365 * 24 * 60 * 60 * 1000会被默认为int型而溢出,注意至少“L”的用处了吧,加到其后即可。

还有:timeInSeconds * 1000也会发生溢出现象,应写成timeInSeconds * 1000L。

 

12.

Log.e("tag",e.getMessage());

 

 Caused by: java.lang.NullPointerException: println needs a message 

一般会考虑到e==null 的情况,但容易忽略e.getMessage()==null的情况。

 

 

13.

Map<String, User> map = ........;
		User user = map.get("xx");
		for (String favor : user.getFavors()) {
			System.out.println("favor:" + favor);
		}

切要注意:如果有其他对map中user的操作(如:随时间推移,人是会增加favor‘兴趣点‘的)在进行着,则打印出的user的favor是可能会变化的,可能导致在read 'favor'时正在write 'favor'而出现意想不到的逻辑错误。

14.

ListView 点击item事件无响应:一般是list_item中有button、radioButton、checkbox之类的组件抢占焦点导致的,只需要在组件设置focusable="false"即可。

如果既要checkbox可点击又要list_item可点击,怎么办?其实同上面一样,设置checkbox的focusbalse="false"就行。

 

15.

 

public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if(convertView == null){
holder = new Holder();
convertView = inflater.inflat(R.layout.test);
holder.tv = convertView.findViewById(R.id.tv);
convertView.setTag(holder);
} else{
holder = convertView.getTag();
}
if(item==null){
convertView = inflater.inflat(R.layout.line);
return convertView;
}
holder.tv.setText(position + "");
return convertView;
}

相要在item==null时,有分隔的效果:(1、2、3、4、5、6与"====="分隔线布局完全不一样)

看似没问题,但一旦用至到"缓存",就会崩溃holder.tv.setText,其中holder为null。把listview上拉至”=====“消失,就会崩溃了。

 

16.

ListView作为子view时,

<LinearLayout><TextView/><ListView/><Button/></LinearLayout>

如果ListView的子项多到一页显示不完,则Button控件不会显示出来。

<ScrollView><LinearLayout><ListView/></LinearLayout></ScrollView>

ListView最多只显示出第一行,多余的项可通过ListView的滚动条查看。

 

17.

<RadioButton />要注意设置focusable='false',否则它会抢占焦点导致点击事件失灵;还要注意不要设置layout_width和layout_height为'wrap_content',否则在刚开始如果checked='false'的话,通过代码设置setChecked(true)会看不到radioButton的checked状态图标。注:如果组合android:clickable='false',则无法点击此radioButton,在点击item时直接穿过它。

 

18.

EditText的android:imeOptions="actionNext"不起效果,是因为没有设置android:singleLine="true"。

 

19.

Intent i = new Intent(this, xxx.class);

i.putExtra(ExtraConst.EXTRA_PARCELABLE,bitmap);

startActivity(i);

跳转不起作用,始跳转不到xxx页面,且不报错。但控制台打印出:

 

03-26 14:21:13.473: I/Timeline(19822): Timeline: Activity_launch_request time:117928578
03-26 14:21:13.483: E/JavaBinder(19822): !!! FAILED BINDER TRANSACTION !!!

原因官网说的很详细,详见官网说明:TransactionTooLargeException
 

20.

比如在客户端封装了一个Exception,如XException(extends Exception) e,如果抛出异常如SocketTimeOutException,然而在e.getCause==null,只是e.getMessage()包含"SocketTimeOutException"异常信息,说明此异常并非是包装在XException中的,在作if(e instanceof SocketTimeOutException")判断时,直接编译错误:Incompatible conditional operand types XException and SocketTimeoutException(不相容的条件操作数类型), 这时异常的来源就很明确了,说明此异常并非客户端的,而是来源服务器端的异常信息。下面给出异常层次:

Throwable >> (Error,Exception >> (IOException,Runtime Exception)),其中SocketTimeoutException extends InterruptedIOException extends IOException。

 

21.

在一个Activity里面重写onNewIntent(Intent intent)后,如果通过Intent传值过来,一定要用onNewIntent里面的参数intent而不要getIntent(),否则获取的还是上次传的intent。

 

22.

在单例模式中,切要注意在切换账号时,有很多listeners要反注册掉,这时要将单例置空,因为一般有些初始化放到了private的单实例构造器里,比如地图相关的初始化,在destroy掉时,其单实例未置空导致在调用方法时,根本没有地图相关的类成功实例化,而出现空指针异常。

 

23.

21:44--->格式化hh:mm:ss=》09:44,HH:mm:ss=》21:44,注意h与H的区别。

 

24.

 

List<String> LIST = new ArrayList<>();
		LIST.add("a");
		LIST.add("b");

		Map<String, List<String>> map = new HashMap<>();

		List<String> list = new ArrayList<>();
		list.add("X");

		map.put("a", list);

		list = LIST;

		List<String> l = map.get("a");
		for (String s : l) {
			System.out.println(s);
		}

输出:A:a b,B:X。答案是B。
 

25.

在GridView 的adapter里的getView在positon==0时,总是被重复调用多次,且在点击gridView的item时,回调了getView(position==0)一次。解决方法:见GridView Adapter里的getView为啥会多次调用position 0

 

26.

sql = "SELECT * FROM test WHERE uid=100001 AND x=1 OR y=2;

注意,由于先AND再OR,所以是肯定能查出uid不等于100001的记录的,这一点不要混乱了。

 

27.

在listview的item里如果有button,那么item无法点击,要想item和button同时都可点击,应该在<button>里加focusable=“false”即可。

 

28.

在数据库中NULL就对应String的null,而空(即表里面什么也没有)则表示String的""。

 

29.

在Activity中有onCreate和onNewIntent(Intent i),其中由于onNewIntent中有参数intent,故在封装方法时,要注意:如封装方法initData()时就应该是inintData(Intent intent)这样就不会直接在initData中getIntent().getXXX了,onNewIntent中有intent参数就直接用,否则出现逻辑问题,因为onNewIntent方法里面用getIntent()得到是上次传的intent。

 

30.

在jdbc连接中url=jdbc:mysql://localhost:3306/tomcat_kwgaj?useUnicode=true&characterEncoding=utf-8中间的&应该替换为&amp;方才正确,否则是起不到作用的。这里&amp;是&的转义,就像&lt;是<、&gt;是>、&quot;是“”、&nbsp;是空格一样。

 

31.

如果android中findViewById(R.id.xx)在xxx.xml中莫名地为Null,则应该看看布局文件xxx.xml里面如TextView写成了TestView、layout_width/height未写等问题,因为这些问题在运行时才会出问题,编译时不报错误提示。

 

32.在onNewIntent(Intent intent)回调中已有intent参数,故切不要在方法里面写getIntent()这样的式子!

 

33.

HttpManager.java:

public class HttpManager {
private static IHttpManager sInstance;
private HttpManager() {
}
public static IHttpManager get() {
if (sInstance == null) {
sInstance = new InnerHttpManagerImpl();
}
return sInstance;
}
public static interface IHttpManager {
public User getUser();
public void login();
}
}

InnerHttpManagerImpl.java:

public class InnerHttpManagerImpl implements IHttpManager {
private User mCurUser;
@Override
public User getUser() {
return mCurUser;
}
@Override
public void login() {
mCurUser = new User();
mCurUser.name = "zs";
mCurUser.age = 12;
}
}

Test.java:

public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
IHttpManager httpMgr = HttpManager.get();
httpMgr.login();
User u = httpMgr.getUser();
u = null;
System.out.println(u + "," + httpMgr.getUser());
}
}

输出为:null,null吗?在错特错!!!!

34.

如果一个Activity有三个依赖的Fragment,一定要注意:不要定义相同的view id,这与不同Activity的contentView可以定义一样的view id不同,不然出现findViewById找不到后面定义的相同id!!!!!!

原因:getActivity返回的是同一个activity的实例,所以两个同样的view id,怎么找?

 

35.

public static String[] separatorSplit(String s) {
		StringTokenizer token = new StringTokenizer(s, STRING_SEPARATOR);
		String[] arr = new String[token.countTokens()];
		int index = 0;
		while (token.hasMoreTokens()) {
			arr[index] = token.nextToken();
			index++;
		}
		return arr;
	}

其中,STRING_SEPARATOR="_xYz_",字符串s="100001_xYz_Wx_xYz_https://mp.weixin.qq.com/s?__biz=MjM5OTUzNzMyNA==&mid=2651157071&idx=1&sn=729186b3f2b2bb014c3cb6709bbec119&chksm=bcc82d8c8bbfa49a6f8146aedcac6a88443bad8eeeda9e61288dfd12dae3661373151a333d6a"

用上面的方法,得到三个参数param0 = 100001,param1=Wx,param2=https://mp.wei,请问,这是为什么,按理说param2="https://mp.weixin.qq.com/s...............啊。why?所以,暂时慎用StringTokenizer,而用split.

推荐使用split进行字符串拆分

从上面两种方法的案例其实可以看出String.split()方法比StringTokenizer类的拆分方法更好便捷,也更好用。 
毕竟大多数时候拆分得到的子字符串是要进行操作的,而StringTokenizer类操作子字符串是靠遍历进行的,不仅麻烦,效率也低,相比之下运用数组进行下标操作就方便多了,事实上官方也不推荐用StringTokenizer类生成对象的方法来进行字符串的拆分操作了。

来自:https://blog.youkuaiyun.com/pigdreams/article/details/70449891

 

36.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值