那些年工作中踩过的坑

最近程序媛小白在开发中遇到的一些低级错误,但为了避免同样的错误再次出现,还是记录下来
1 日期问题

(1)yyyy年MM月dd日 写成了大写的 YYYY,转换会出现意想不到的日期!!

(2)

Date endDate = DateTimeUtil.strToDate("2024-08-03 23:59:59", "yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); 
calendar.setTime(endDate); 
calendar.set(Calendar.HOUR, 23); 
calendar.set(Calendar.MINUTE, 59); 
calendar.set(Calendar.SECOND, 59); 
System.out.println(calendar.getTime());

这里的时间变成了 2024年8月04 11:59:59   不是 2024年8月04 23:59:59也不是 2024年8月03 23:59:59

2 java操作文件

java代码里处理文件删除后,linux服务器上的磁盘空间并没有真的释放,
为什么呢?文件句柄依然在?怎么彻底释放空间呢?
(1)背景:在导出数据时发现一般一个txt 有8G,zip后也有差不多1G左右,但zip后源文件txt已经删除后磁盘空间依然不释放,导致本来
100G的磁盘空间,看着使用了81G,慌慌的即将磁盘爆满还找不到是哪儿占用的!最后通过分析剩下的数据不到2G,剩下的20G足够;
先睡觉第二天换个脑子,但疑问还是未解开,那81G是怎么回事??!

第二天早早到了公司心想数据都跑完了,要不重启下服务看下是否会释放磁盘空间,果然重启后磁盘占用率变成1%,直觉有时是最简单有效的呢,但也需要谨慎,
能否重启是因为它是一个跑数据的java进程,不涉及生产服务所以敢重启呢。

看来释放java进程删除文件未释放的空间,最简单粗暴的办法是重启java进程,有没有其他一劳永逸的方法呢?总不能程序跑着还得有人盯着
磁盘满不满?那也太...
网上提供了一个方法说先把文件清空,然后再删除,先用这个笨方法咯

3 数据库时区问题
其实数据库时区是SYSTEM,并没有问题,是代码里的日期转换类设置的时区是UTC,导致写入数据库的时间+8小时!
假如数据库时区不是当地时区,可以通过在jdbc连接上加上serverTimeZone=Asia/Shanghai来设置当地时区

4 mybatis问题

service有时空指针问题,小白因为测试接口发现系统异常,总是包Nullpointer错误,各种debug最终还是mapper的sql问题,或者参数和入参定义不一致!!

是因为mapper参数对应问题、或sql语法问题(比如多逗号)

5 不同类型的数据类型比较

Integer a = 1;
Byte b = 1;
a.equals(b); //false

以下三个小错误是阿里java代码规范中看到的反例,大家一起引以为戒
(1)switch语句,NPE问题
public static void main(String[] args) {
        //会抛出空指针异常
        method(null);
    }

    public static void method(String param) {
        //switch的参数为string时,需要先进行判空,避免NPE问题
        switch (param) {
            // 肯定不是进入这里
            case "sth":
                System.out.println("it's sth");
                break;
            // 也不是进入这里
            case "null":
                System.out.println("it's null");
                break;
            // 也不是进入这里
            default:
                System.out.println("default");
        }
    }
(2)finally中不要加入return语句,避免意想不到结果返回
int x = 0;
        try {
            // x 等于 1,此处不返回
            return ++x;
        } finally {
            // 返回的结果是 2
            return ++x;
        }

(3)三目 条件运算符类型对齐时可能NPE
Integer a = 1;
        Integer b = 2;
        Integer c = null;
        Boolean flag = false;
// a*b 的结果是 int 类型,那么 c 会强制拆箱成 int 类型,抛出 NPE 异常
        Integer result=(flag? a*b : c);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值