首页   >   心得技巧

记一次Java重写父类方法导致栈溢出的经历

今天在重写一个父类方法时,忘记在调用的地方加上super关键字,导致Java栈溢出,报了一个“StackOverflowError”异常,因为调用栈太深了,所以日志超级无敌巨多。

贴张图给大家感受一下:

记一次Java重写父类方法导致栈溢出的经历

这里我只贴出一小部分。

java.lang.StackOverflowError: null
        at java.lang.Character.isWhitespace(Character.java:6789)
        at java.lang.Character.isWhitespace(Character.java:6757)
        at org.apache.commons.lang3.StringUtils.isBlank(StringUtils.java:346)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:28)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)
        at com.wolffy.reader.service.impl.UserServiceImpl.insert(UserServiceImpl.java:29)

可以看到,信息中提到的全部是UserServiceImpl的29行代码报错了,去看了一下,一开始竟然还没看出来

@Override
public User insert(User user) {
    if (!StringUtils.isBlank(user.getWxOpenId())) {
        return super.insert(user);
        //return insert(user); // 29行,万恶之源
    }
    String pass = user.getPassWord();
    if (StringUtils.isBlank(pass)) {
        pass = AESUtil.encrypt(Constants.DEFAULT_PASS);
    } else {
        pass = AESUtil.encrypt(pass);
    }
    user.setPassWord(pass);
    return super.insert(user);
}

注释掉的这一行就是异常信息中的第29行,这里没有指定调用super的方法,所以它默认会疯狂的递归调用自己,直到jvm的栈深度不够了,就会导致jvm栈溢出。

QQ群Ⅰ: 686430774 (已满)

QQ群Ⅱ: 718410762 (已满)

QQ群Ⅲ: 638620451 (已满)

QQ群Ⅳ: 474195684

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-05-20

永久地址:https://www.jiweichengzhu.com/article/d45fd4e84a5e4859a58e43346f93c30b

评论