拓冰建站拓冰建站
首页 / 资讯中心 / 正文

全新 50 例 Java 迷惑搞笑代码片段

一、基础语法 类型转换迷惑代码1~10浮点精度阴间判断double a 0.1 0.2; if(a 0.3) { System.out.println(相等); }亮点0.10.2≠0.3浮点二进制存储精度丢失测试偶现逻辑失效。自增后置迷惑赋值int x 1; x x; System.out.println(x); // 输出1亮点后置自增先取值再自增赋值覆盖自增结果新人必踩。char 数字参与运算char c 9; int num c; System.out.println(num);亮点输出字符 ASCII 码 57不是数字 9忘记字符和数值转换。超大 int 字面量不加 Llong num 9999999999;亮点数字超出 int 范围编译直接报错漏写后缀 L。Boolean 包装类 判断Boolean b1 Boolean.valueOf(true); Boolean b2 Boolean.valueOf(true); System.out.println(b1 b2);亮点Boolean 只有 true/false 缓存看似没问题但动态字符串场景极易踩坑。空字符串判断写反if(.equals(str) false) {}亮点可读性极差规范直接用!Objects.isEmpty(str)。位运算代替乘除不加括号int res 2 2 1;亮点 优先级高于移位等价2 3预期 4*5 结果完全错误。三目运算符类型隐式转换Object obj true ? 1 : 2;亮点一边 Integer 一边 String统一向上转型 Object后续强转必抛异常。方法重载参数自动装箱踩坑public void test(Integer i){} public void test(int i){} test(null);亮点传入 null 无法匹配 int只能匹配 Integer不注意会空指针。静态变量在构造器反复赋值static int count 0; public Demo(){ count 100; }亮点每 new 一个实例就覆盖静态变量全局计数彻底失效。二、Stream/Lambda 新型迷惑写法11~20无之前重复坑findAny 当成有序取值list.stream().filter(...).findAny().get();亮点串行偶然取第一个并行随机取值业务依赖顺序直接出错。mapping 下游收集器层级写反groupingBy(User::getType, mapping(User::getId, groupingBy(Function.identity())))亮点多层下游收集器嵌套类型推导报错调试半天分不清层级。Stream.concat 后复用原始流Stream s1 list1.stream(); Stream s2 list2.stream(); Stream.concat(s1,s2).count(); s1.collect(toList());亮点concat 会消费原流第二行直接报流已关闭异常。IntStream 装箱忘记 boxedIntStream.range(1,10).collect(toList());亮点IntStream 无对象无法直接收集 List必须.boxed()。partitioningBy 后直接 get (true) 不判空MapBoolean,ListUser map list.stream().collect(partitioningBy(...)); ListUser success map.get(true); success.get(0);亮点无符合条件数据时 get 返回空集合get (0) 下标越界。方法引用多参数匹配错误list.stream().map(MyUtil::calc); // calc方法接收两个参数编译器无法自动补全第一个宿主参数亮点类名实例方法、对象实例方法两种引用规则混淆编译报错。自定义 Predicate 闭包修改外部变量int flag 0; PredicateUser pre u - flag 1; flag 1;亮点flag 有效 final 校验失败直接编译报错想动态切换条件行不通。sorted 比较器返回随机正负list.stream().sorted((o1,o2)-new Random().nextInt(3)-1);亮点比较器不满足全序规则并行排序死循环、数据错乱。Stream 生成无限流无短路终止Stream.iterate(0,i-i1).map(String::valueOf).collect(toList());亮点无限流一次性收集直接 OOM 卡死程序。map 后返回 null下游 toMap 触发 NPElist.stream().collect(toMap(User::getId, u-null));亮点toMap 收集器不允许 value 为 nullHashMap 原生允许但收集器限制。三、集合工具类 容器迷惑操作21~30Arrays.asList 创建固定大小集合执行 addListString list Arrays.asList(a,b); list.add(c);亮点底层是数组视图定长不可变新增抛不支持操作异常。TreeMap key 未实现 ComparableMapUser,String tree new TreeMap(); tree.put(new User(),test);亮点无比较器直接抛类型转换异常。HashSet 存可变对象修改属性后无法删除User u new User(1,张三); SetUser set new HashSet(); set.add(u); u.setId(999); set.remove(u);亮点hashCode 改变存储下标偏移remove 永远删不掉元素。Collections.singletonList 循环 addListLong single Collections.singletonList(1L); single.add(2L);亮点单元素不可变列表修改直接抛异常。Iterator 迭代器多次调用 nextIteratorUser it list.iterator(); while(it.hasNext()){ User u1 it.next(); User u2 it.next(); }亮点奇数条数据直接 NoSuchElement 下标越界。LinkedHashMap 当作普通 HashMap 不开启访问有序MapLong,String map new LinkedHashMap(16,0.75f,false);亮点第三个参数 false不会记录访问顺序做 LRU 缓存完全失效。ArrayList subList 传颠倒起止下标list.subList(20,5);亮点startend 直接抛 IllegalArgumentException。List.of () JDK9 不可变集合 remove 元素ListString list List.of(x,y); list.remove(x);亮点编译无报错运行抛出不支持操作异常。用 Set 去重实体忘记重写 equals/hashCodeListUser list ...; SetUser set new HashSet(list);亮点同 ID 不同对象不会判定重复去重完全无效。Queue 队列 peek 后直接 poll多线程丢失数据if(queue.peek() ! null){ User u queue.poll(); }亮点peek 和 poll 中间线程切换元素被其他线程取走poll 返回 null。四、并发、锁、CompletableFuture 新坑31~40CompletableFuture allOf 不捕获子任务异常CompletableFuture.allOf(f1,f2,f3).join();亮点任意子任务异常join 直接抛异常无单独日志定位失败任务。Lock 不加 finally 释放锁Lock lock new ReentrantLock(); lock.lock(); doBiz(); lock.unlock();亮点业务抛异常直接跳过 unlock死锁永久阻塞。Semaphore 信号量获取不归还sem.acquire(); if(flag) return; sem.release();亮点分支提前 return信号量永久泄漏后续请求全部阻塞。CompletableFuture supplyAsync 返回 nullCompletableFutureString future CompletableFuture.supplyAsync(()-null); future.get().length();亮点get 拿到 null后续调用方法空指针。读写锁读锁内执行写操作readLock.lock(); userMap.put(1,test); readLock.unlock();亮点读锁共享多线程并发修改容器数据错乱。ExecutorService shutdown 后继续提交任务pool.shutdown(); pool.submit(()-{});亮点线程池关闭提交任务直接抛出拒绝执行异常。CompletableFuture exceptionally 只捕获异常不兜底返回future.exceptionally(e-{log.error(失败);}); String res future.join();亮点异常分支无返回值join 拿到 null后续代码空指针。CyclicBarrier 循环复用某次线程中断不重置barrier.await(1,TimeUnit.SECONDS);亮点等待超时屏障损坏下次使用直接异常必须手动 reset。异步任务修改方法局部变量void test(){ ListLong ids new ArrayList(); CompletableFuture.runAsync(()-ids.add(1L)); }亮点ids 非有效 final编译直接报错闭包限制。并行流修改 AtomicInteger 计数搭配 limit 结果不准AtomicInteger count new AtomicInteger(); list.parallelStream().limit(10).forEach(u-count.incrementAndGet());亮点limit 短路操作并行执行顺序混乱计数小于预期条数。五、IO、资源、异常处理奇葩代码41~45IO 流不关闭不使用 try-with-resourcesFileInputStream fis new FileInputStream(a.txt); byte[] buf new byte[1024]; fis.read(buf);亮点文件句柄泄漏频繁读写后打开文件数超限报错。try-with-resources 捕获资源关闭异常try(FileInputStream fis new FileInputStream(1.txt)){ }catch (IOException e){}亮点文件存在但关闭时抛出异常也会被捕获分不清读文件还是关文件报错。throw new RuntimeException (e.getMessage ()) 丢失堆栈try{ readFile(); }catch (Exception e){ throw new RuntimeException(e.getMessage()); }亮点只传递异常信息原始堆栈完全丢失无法定位根因。自定义异常无参构造丢失根因 Throwablepublic class BizException extends RuntimeException{ public BizException(String msg){super(msg);} }亮点捕获底层异常封装时无法传递 cause日志看不到原始报错栈。close 方法写在 if 分支异常后资源不释放InputStream is getStream(); if(is ! null){ readData(is); is.close(); }亮点readData 抛异常直接跳过 close句柄泄漏。六、注解、反射、业务迷惑奇葩代码46~50Transactional 加在 private 私有方法Transactional private void saveData(){}亮点Spring AOP 无法拦截私有方法事务完全失效。反射获取字段不设置 AccessibletrueField field User.class.getDeclaredField(id); field.get(user);亮点private 字段直接访问抛权限异常。Data 实体同时手写 getter冲突覆盖Data public class User{ private Long id; public Long getId(){return -1L;} }亮点Lombok 生成的 getter 被手写方法覆盖取值永远 - 1隐蔽 bug。反射循环创建 Class 对象加载类for(int i0;i1000;i){ Class.forName(com.demo.User); }亮点重复加载无危害但完全多余浪费类加载资源。注解参数传 null框架解析报错ApiParam(value null,name id)亮点注解属性不允许 null部分框架启动直接抛注解解析异常。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门