• Java开发多年写过的BUG都在这了!!!(2022.8更新)


    1.Caused by: java.lang.ArithmeticException: / by zero

    这个其实很少遇到,只有初学的时候会。

    1. int a = 1;
    2. int b =0;
    3. int c = a/b;//报错

    2.substring 空指针

    一个不注意经常碰到

    1. String str = null;
    2. str.substring(0,10);//报错Caused by: java.lang.NullPointerException

    3. String 与Long 用equals判断相等

    碰到过,贼尴尬。

    1. String a ="123";
    2. Long b = 123L;
    3. if(a.equals(b)){
    4. System.out.println("a等于b");//错
    5. }

    4.Integer 用==判断相等

    这个以前也会碰到,不注意就直接用 ==,现在几乎不会再犯这个错了。

    1. Integer a = 128;
    2. Integer b = 128;
    3. if (a == b) {
    4. System.out.println("a等于b"); //错
    5. }

    5. switch..case忘记加break

    这个粗心的话会碰到,不过不多。

    1. int i = 1;
    2. int num =0;
    3. switch (i) {
    4. case 0:
    5. num++;
    6. case 1:
    7. num++;
    8. case 2:
    9. num++;
    10. break;
    11. default:
    12. System.out.println(3);
    13. }
    14. System.out.println("预测输出结果为1-----》正确答案:"+num);//正确为2, case 1忘记加break;

    6. try和finally都加return,finally为准

    这个只是玩玩的,正常代码谁这么写??

    1. public class Test {
    2. public static int test(){
    3. try {
    4. return 0;
    5. } catch (Exception e) {
    6. }finally{
    7. return 1;
    8. }
    9. }
    10. public static void main(String[] args) {
    11. System.out.println(test()); // 1
    12. }
    13. }

    7. list空指针

    这个是个常见的bug

    1. List list = null;//业务查询
    2. for (String s : list) {
    3. }
    4. 改成
    5. class ListUtil{
    6. public List<> nvlList( list){
    7. return list ==null ?new ArrayList<>() : list;
    8. }
    9. }
    10. 改成:
    11. for (String s : ListUtil.nvlList(list)) {
    12. }

    8. list移除元素

    常见。

    1. for(String s:list){
    2. list.remove(s);//java.util.ConcurrentModificationException
    3. }
    4. for(int i=0;i
    5. list.remove(i);//下标不会随着改变,会导致错误
    6. }

    改成:

    1. 方式1
    2. for(Iterator it=list.iterator();it.hasNext();){
    3. it.remove();//用迭代器删除,不用用list的remove方法
    4. }
    5. 方式2
    6. for(int i=0;i
    7. list.remove(i);
    8. i=i-1;//重置下标
    9. }
    10. 方式3:(jdk8) 移除元素 2
    11. List list = new ArrayList<>();
    12. for (int i = 0; i < 5; i++) {
    13. list.add(i);
    14. }
    15. List newList = list.stream().filter(o -> o != 2).collect(Collectors.toList());
    16. System.out.println(newList);

    9. 重复迭代器移除元素报错,大坑,推荐 list.stream().filter

    也是常见,蛮尴尬的,不过犯过错应该就不会再犯了。

    1. List list = new ArrayList<>();
    2. for (int i = 0; i < 5; i++) {
    3. list.add(i);
    4. }
    5. Iterator it = list.iterator();
    6. while(it.hasNext()){
    7. it.remove();
    8. it.remove();//重复移除就会报错
    9. }

    10. Arrays.asList()转化的list,不能增删,java.lang.UnsupportedOperationException

    可能会碰到,工作中没遇到。

    1. Integer[] arrs = {1,2,3,4};
    2. List list = Arrays.asList(arrs);
    3. list.add(5);//错误,此时返回的list是静态内部类,只能查询不能增删。

    11. List<对象>,对象属性值改变,list中的对象也改变

    由于add 和addAll方法添加的是对象的引用,因此,如果对象发生改变,那么list也会改变。

    1. void test1(){
    2. List list = new ArrayList<>();
    3. Student stu = new Student();
    4. stu.setName("a");
    5. list.add(stu);
    6. test2(list);
    7. System.out.println(list.get(0).getName());//此时打印的结果是“b”,而不是“a”
    8. }
    9. void test2(List list){
    10. for(Student s : list){
    11. s.setName("b");
    12. }
    13. }

    12.listmap 别以为map.clear();就可以重新 list.add(map);了

    脑抽的时候会转不过弯。

    1. List> list= new ArrayList<>();
    2. Map map = new HashMap<>();
    3. map.put("id", 1);
    4. list.add(map);
    5. map.clear();//这是没用的,引用没变,所以后面再添加,也是同一个map,要改成map = new HashMap<>();
    6. map.put("id", 2);
    7. list.add(map);
    8. System.out.println(list);
    9. //结果: [{id=2},{id=2}]

  • 相关阅读:
    Java 中通过 key 获取锁
    AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读
    Qt的定时器QTimer
    你还不懂java的日志系统吗
    Java架构师系统架构设计原则
    【Spring IOC/DI】bean 的 5 种注册 与 5 种注入
    C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组
    C++ 学习系列 -- std::vector (未完待续)
    华为OD机考:0030-0031-n*n数组中二进制的最大数、整数的连续自然数之和
    [Swift]定义一个全局的可管理的计时器
  • 原文地址:https://blog.csdn.net/x18094/article/details/126445775