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中间的&应该替换为&方才正确,否则是起不到作用的。这里&是&的转义,就像<是<、>是>、"是“”、 是空格一样。
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.