当前位置: 首页 > news >正文

Java雷坑整理(2)

PIT 06:域和流

下面的代码是一个文件拷贝的方法,设计的是即便抛出异常也会关闭流:

public static void pit06(String src,String dest) throws IOException { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); out = new FileOutputStream(dest); byte[] buf = new byte[1024]; int n; while((n=in.read(buf))>0) { out.write(buf,0,n); } } catch(Exception e) { e.printStackTrace(); } finally { if(in!=null) { in.close(); } if(out!=null) { out.close(); } } }

这个程序看起来已经面面俱到了,不过可惜的是,finally块里,当close方法异常时,还是会无法关闭流,即close的调用可能会导致finally代码块异常结束,解决的方法也很简单,把close的调用放到嵌套在try catch块里即可:

} finally { try { if(in!=null) { in.close(); } } catch(Exception ex) { ex.printStackTrace(); } try { if(out!=null) { out.close(); } } catch(Exception ex) { ex.printStackTrace(); } }

PIT 07:有毒的括号

众所周知,Integer.MAX_VALUE的值是2147483647Integer.MIN_VALUE的值是-2147483648,但如果这样写:

public static void pit07() { int i = -(2147483648); }

这里编译肯定会报错,程序会先计算括号里的内容,报超出int范围,所以你的业务代码里加括号的内容一定要捋清楚,防止踩坑。

PIT 08:三元表达式

你会怎么理解这段代码呢:

public static void pit08() { char x = 'X'; int i = 0; System.out.println(true?x:0); System.out.println(true?x:i); }

毫无疑问这里两次输出的都是变量x的值,但并不是XX,而是X88
这里可以从条件表达式结果类型的规则来找原因,对于表达式的第二个和第三个操作数的类型判断,其中有这么三条规则:

1.如果这两个操作数具有相同的类型,那么它就是条件表达式的类型;
2.如果一个操作数的类型是T(byte、short、char),而另一个操作数是一个int类型的常量表达式,它的值可以用T来表示,那么条件表达式的类型就是T;
3. 否则,将对操作数的类型进行二进制数字提升,而条件表达式的类型就是提升后的类型。

第一个输出语句满足第二条,所以输出X,第二个输出语句满足第三条,对charint进行二进制数字提升之后,就是int,输出X的Unicode码88

PIT 09:转义字符与Unicode

当转义字符遇到Unicode,简直不要再崩溃:

/** * from D:\Test\units\Test01.java */ public static void pit09() { System.out.println("Hello Word!"); }

很简单的一个输出语句,却连编译都通不过,问题就出在注释里,\u是Unicode码的开始,即便它在注释里,编译器依旧不会放过它,可想而知,代码里如果有类似现象,写不清楚的Unicode,该是多么崩溃。

PIT 10:i==-i

正常来说,满足i==-i的整数数值只有0,但在程序里,还有两个数,那就是Integer.MIN_VALUEInteger.MAX_VALUE,这是因为-运算符是对数值进行二进制补码运算的,即取反加一,而这两个数补码运算后,它的低32位等于它本身,虽然高位溢出了,但会被Java忽略,故而依旧满足上述表达式。如果你的程序中有该判断逻辑,那就要小心了。

精彩待续。。。

相关阅读:Java雷坑整理(1)

http://www.jsqmd.com/news/1281484/

相关文章:

  • 告别手忙脚乱!这款FF14智能钓鱼辅助工具让你轻松成为钓鱼大师
  • 基于行空板扩展板的智能家居中控系统:从硬件设计到软件实现
  • 【Bug已解决】vllm process crashed because of dp coordinator receives unexpected message... 解决方案
  • BKA-CNN-LSTM多变量回归预测模型解析与Matlab实现
  • bq2415x评估模块实战:从开关电源原理到锂电充电设计避坑指南
  • 高级游戏自动化引擎架构设计:基于MaaFramework的《重返未来:1999》自动化助手深度解析
  • 宁波包包回收有无隐形收费,上门鉴定估价不收取额外费用 - 好物测评局
  • JAVA计算机毕设之基于 SpringBoot+Vue 的高校学生线上互助答疑与学习资料共享平台 数字化校园学习互助社区与教学资源管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • ChatBI上线前必答的合规清单:权限、审计与敏感数据边界
  • Hibernate关联关系(一对多)
  • LabVIEW 做交流氩弧焊弧压跟踪,3 种方案实测对比
  • 凭据管理10条安全红线:这些错千万别犯
  • 高效能人士的10个偷懒技巧:系统化思维与时间管理
  • 开源项目维护避坑指南:Issue 管理、Breaking Change 与社区关系的平衡
  • 七层路由的艺术:Envoy 的 HTTP 路由、重试与限流策略
  • JAVA计算机毕设之基于SpringBoot+Vue的校园共享单车信息化运维管理系统 校园共享单车故障上报与车辆调度管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年8月青岛资质齐全的刑事辩护律师推荐,李坤经验丰富服务好,专业可靠口碑好 - 十大排行榜推荐
  • 伊利亚·苏茨克维尔的安全超级智能公司与英伟达合作推进AI研究
  • NBM7100A与PIC18LF4685在低功耗物联网设备中的优化实践
  • 三步搞定Windows和Office永久激活的终极解决方案
  • NBM7100A与STM32G431RB优化低功耗物联网设备电池寿命
  • .NET构建发布演进:从MSBuild到现代化流水线
  • OpenRGB终极指南:一站式免费开源RGB灯光控制软件
  • 数据通信基础(一)
  • Java调Python脚本实时输出print信息
  • 如何3步搞定B站评论数据分析:这个自动化工具让你轻松获取完整用户互动数据
  • 提交本地项目到码云报错
  • 【Bug已解决】Gemma 4 12B is not working 解决方案
  • ROS1阳性肺癌耐药怎么办?FDA批准新药Jideytro(zidesamtinib)带来新希望【海得康】
  • GEO优化怎么帮小企业获客?广拓时代拆解AI搜索新入口