1.Caused by: java.lang.ArithmeticException: / by zero
这个其实很少遇到,只有初学的时候会。
int a = 1;
int b =0;
int c = a/b;//报错
2.substring 空指针
一个不注意经常碰到
String str = null;
str.substring(0,10);//报错Caused by: java.lang.NullPointerException
3. String 与Long 用equals判断相等
碰到过,贼尴尬。
String a ="123";
Long b = 123L;
if(a.equals(b)){
System.out.println("a等于b");//错
}
4.Integer 用==判断相等
这个以前也会碰到,不注意就直接用 ==,现在几乎不会再犯这个错了。
Integer a = 128;
Integer b = 128;
if (a == b) {
System.out.println("a等于b"); //错
}
5. switch..case忘记加break
这个粗心的话会碰到,不过不多。
int i = 1;
int num =0;
switch (i) {
case 0:
num++;
case 1:
num++;
case 2:
num++;
break;
default:
System.out.println(3);
}
System.out.println("预测输出结果为1-----》正确答案:"+num);//正确为2, case 1忘记加break;
6. try和finally都加return,finally为准
这个只是玩玩的,正常代码谁这么写??
public class Test {
public static int test(){
try {
return 0;
} catch (Exception e) {
}finally{
return 1;
}
}
public static void main(String[] args) {
System.out.println(test()); // 1
}
}
7. list空指针
这个是个常见的bug
List<String> list = null;//业务查询
for (String s : list) {
}
改成
class ListUtil{
public List<> nvlList( list){
return list ==null ?new ArrayList<>() : list;
}
}
改成:
for (String s : ListUtil.nvlList(list)) {
}
8. list移除元素
常见。
for(String s:list){
list.remove(s);//java.util.ConcurrentModificationException
}
for(int i=0;i<list.size();i++){
list.remove(i);//下标不会随着改变,会导致错误
}
改成:
方式1:
for(Iterator<String> it=list.iterator();it.hasNext();){
it.remove();//用迭代器删除,不用用list的remove方法
}
方式2:
for(int i=0;i<list.size();i++){
list.remove(i);
i=i-1;//重置下标
}
方式3:(jdk8) 移除元素 2
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
List<Integer> newList = list.stream().filter(o -> o != 2).collect(Collectors.toList());
System.out.println(newList);
9. 重复迭代器移除元素报错,大坑,推荐 list.stream().filter
也是常见,蛮尴尬的,不过犯过错应该就不会再犯了。
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
it.remove();
it.remove();//重复移除就会报错
}
10. Arrays.asList()转化的list,不能增删,java.lang.UnsupportedOperationException
可能会碰到,工作中没遇到。
Integer[] arrs = {1,2,3,4};
List<Integer> list = Arrays.asList(arrs);
list.add(5);//错误,此时返回的list是静态内部类,只能查询不能增删。
11. List<对象>,对象属性值改变,list中的对象也改变
由于add 和addAll方法添加的是对象的引用,因此,如果对象发生改变,那么list也会改变。
void test1(){
List<Student> list = new ArrayList<>();
Student stu = new Student();
stu.setName("a");
list.add(stu);
test2(list);
System.out.println(list.get(0).getName());//此时打印的结果是“b”,而不是“a”
}
void test2(List<Student> list){
for(Student s : list){
s.setName("b");
}
}
12.listmap 别以为map.clear();就可以重新 list.add(map);了
脑抽的时候会转不过弯。
List<Map<String, Object>> list= new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
list.add(map);
map.clear();//这是没用的,引用没变,所以后面再添加,也是同一个map,要改成map = new HashMap<>();
map.put("id", 2);
list.add(map);
System.out.println(list);
//结果: [{id=2},{id=2}]