Cannot Reference “XxxClass.xxxmember” Before Supertype Constructor Has Been Called

这篇具有很好参考价值的文章主要介绍了Cannot Reference “XxxClass.xxxmember” Before Supertype Constructor Has Been Called。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在一个类的构造器还未执行之前,我们无法使用这个类的成员

百度翻译:在调用超类型构造函数之前无法引用“XxxClass.xxx” ----- 我的理解:在一个类的构造器方法还未执行的时候,我们无法使用这个类的成员属性或成员方法。

 

下面是会出现此错误的示例代码

public class MyException extends RuntimeException {
    private int errorCode = 0;
    
    public MyException(String message) {
        super(message + getErrorCode()); // compilation error
    }

    public int getErrorCode() {
        return errorCode;
    }
}

IDE提示错误:Cannot reference 'MyException.getErrorCode' before supertype constructor has been called.

Cannot Reference “XxxClass.xxxmember” Before Supertype Constructor Has Been Called

 

 

说说我怎么遇到这个问题的?

我有一个组件工具类。

 1 @Slf4j
 2 public class Many2OneProcessor<T> {
 3 
 4     private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(15);
 5 
 6     /**
 7      * 将多长时间的多次操作合并成1次,单位:秒
 8      */
 9     private final long intervalSecond;
10     /**
11      * 每次处理多少条数据
12      */
13     private final int perBatchCount;
14     /**
15      * 批次处理逻辑代码
16      */
17     private final Consumer<List<T>> yourBusinessCode;
18     private final ...
19 
20     public Many2OneProcessor(long intervalSecond, Class<T> tClass, Consumer<List<T>> yourBusinessCode) {
21         this(intervalSecond, Integer.MAX_VALUE, tClass, yourBusinessCode);
22     }
23 
24     public Many2OneProcessor(long intervalSecond, int perBatchCount, Class<T> tClass, Consumer<List<T>> yourBusinessCode) {
25         
26         ...此处省略若干行
27         
28     }    
29     
30     public void produce(T t) {
31         redisUtil.lSet(LIST_KEY, t, HOURS.toMillis(1));
32         scheduledThreadPool.schedule(this::consumeMsg, intervalSecond, TimeUnit.SECONDS);
33     }
34 
35     private void consumeMsg() {
36         redisLockTemplate.execute(LOCK_KEY, TimeUnit.SECONDS.toMillis(intervalSecond - 1), false, () -> {
37             
38             ...此处省略若干行
39             
40             List<T> tList = new ArrayList<>(perBatchCount + 1);
41             for (int j = 0; j < perBatchCount; j++) {
42                 Object o = redisUtil.lPop(LIST_KEY);
43                 if (o == null) break;
44                 tList.add((T) o);
45             }
46             if (perBatchCount != Integer.MAX_VALUE && redisUtil.lGetListSize(LIST_KEY) > 0) {
47                 scheduledThreadPool.schedule(this::consumeMsg, intervalSecond, TimeUnit.SECONDS);
48             }
49             
50             ...此处省略若干行
51             yourBusinessCode.accept(tList);
52             
53         });
54     }
55 }

 

注意到其中的两处 Integer.MAX_VALUE,这无形中提高了代码理解和维护(重点是前者)的成本。

于是,做个小小的重构。改为下面这样,代码的可理解方面,更上一层楼。

public class Many2OneProcessor<T> {
    /**
     * 每次处理多少条数据
     */
    private final int perBatchCount;
    private static final int PER_BATCH_COUNT_DEFAULT = Integer.MAX_VALUE;
    
    public Many2OneProcessor(long intervalSecond, Class<T> tClass, Consumer<List<T>> yourBusinessCode) {
        this(intervalSecond, PER_BATCH_COUNT_DEFAULT, tClass, yourBusinessCode);
    }
    
    public void consumeMsg() {
        ...
        
            if (perBatchCount != PER_BATCH_COUNT_DEFAULT && redisUtil.lGetListSize(LIST_KEY) > 0) {
        ...
    }
}

 

注意,常量 PER_BATCH_COUNT_DEFAULT 定义为static,否则会出现上面的预编译错误:Cannot reference 'Many2OneProcessor.PER_BATCH_COUNT_DEFAULT' before supertype constructor has been called。另外,在重构过程中,我使用了一种方案,见下图,也出现了这个错误:Cannot reference 'Many2OneProcessor.perBatchCount' before supertype constructor has been called

Cannot Reference “XxxClass.xxxmember” Before Supertype Constructor Has Been Called

 

后记:邂逅OutOfMemoryError

自测时发现,上面代码在某些case下会执行List<T> tList = new ArrayList<>(Integer.MAX_VALUE+1);,由于Integer.MAX_VALUE+1是负数,程序会抛出异常:java.lang.IllegalArgumentException: Illegal Capacity: -2147483648

另外,如果把上面代码行改为List<T> tList = new ArrayList<>(Integer.MAX_VALUE);,则会抛出:java.lang.OutOfMemoryError: Requested array size exceeds VM limit。继续挣扎,试图改为List<T> tList = new ArrayList<>(Integer.MAX_VALUE/2);,亦会抛出:java.lang.OutOfMemoryError: Java heap space

当未指定perBatchCount参数值时,将其默认值指定为Integer.MAX_VALUE实在欠合理!结合使用场景评定后,将上面的阈值PER_BATCH_COUNT_DEFAULT改为99999。文章来源地址https://www.toymoban.com/news/detail-484636.html

到了这里,关于Cannot Reference “XxxClass.xxxmember” Before Supertype Constructor Has Been Called的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 vite Uncaught (in promise) ReferenceError: Cannot access ‘xx‘ before initialization

    Uncaught (in promise) ReferenceError: Cannot access \\\'BasicForm\\\' before initialization这是 组件之间出现循环引用时导致,我们可以通过异步组件: defineAsyncComponent解决, 在VUE3的官网:https://cn.vuejs.org/guide/components/async.html#basic-usage。 直接引用官网提供的异步组件( defineAsyncComponent ),写法多种。以

    2024年02月12日
    浏览(69)
  • pycharm中keras导入报错分析(无法自动补全,cannot find reference)

     目前无论是中文还是国外网站对于如何正确的导入keras,如何从tensorflow中导入keras,如何在pycharm中从tensorflow里导入keras,这几个问题都众说纷纭,往往是互相借鉴给出一个可用的解决方法,但没有更进一步的解释了。常见因为keras导入引发的问题有以下几个: from tensorflow

    2024年02月03日
    浏览(34)
  • vue3 + vite Cannot access ‘xxx‘ before initialization 组件热更新失败,es模块循环引用问题

    问题原因 本人 在 pinia stores 文件中使用了 router ,而main.ts 已经引入过router main.ts pinia 下 modelCache.ts 文件 pinia 下 modelCache.ts 文件使用了router 并Model组件中 引入了modelCache.ts 该文件 这样导致es模块循环 vite热更新失败 解决 pinia 下 modelCache.ts 文件 router 引入方式改为 函数引入 在

    2024年02月12日
    浏览(73)
  • 【无标题】Cannot find reference ‘imread‘ in ‘__init__.py‘报错的解决方法

      整了好几天终于搞好了 直接写出步骤: 1你的cv2,解释器的路径必须是英文的,我的user的文件在刚买来的时候用的中文名,费了好大劲才改回来,详情请看[(怎么修改电脑的用户名? - 知乎) 2.在轮子网站下载对应版本的轮子https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 注意下载

    2024年02月06日
    浏览(36)
  • 报错opencv Cannot find reference ‘imread‘ in ‘__init__.py‘,可以运行,但无法调用opencv算法

    测试代码为: 有问题的部分为: 灰色部分均为 Cannot find reference in \\\'__init__.py\\\'的报错,但程序可以运行并显示图片。 Cannot find reference ‘imread‘ in ‘__init__.py | __init__.py‘ http://t.csdn.cn/OEaoE 按照该文方法,修改至版本为 4.5.3.56,可以解决问题。但运行环境的opencv版本已经是 4

    2024年02月08日
    浏览(54)
  • 【报错处理】Pycharm使用OpenCV函数时提示“`cannot find reference ‘VideoCapture‘ in __init__.py`“

    Pycharm使用OpenCV函数时提示\\\" cannot find reference \\\'VideoCapture\\\' in __init__.py \\\" 在stackoverflow上找到了适合我的解决方法,方案步骤如下: 打开设置-Python Interpreter: 选择Show All: 点击’文件夹-子文件夹’图标: 添加路径 ...venvlibpython3.9site-packagescv2 至末尾: 一路ok确认,回到主界面

    2024年02月11日
    浏览(44)
  • cannot bind non-const lvalue reference of type ‘***&‘ to an rvalue of type ‘***‘解决方法

    这里的 \\\"bind\\\" 意思是 \\\"绑定\\\"。在 C++ 中,引用是一个指向某个对象的别名,它在声明时必须被初始化,并且它的生命周期与其所绑定的对象一致。在赋值、函数传参等场景中,将引用与相应的对象绑定在一起,称为引用绑定。而 \\\"cannot bind\\\" 则表示无法将该右值和左值引用进行绑

    2024年02月15日
    浏览(45)
  • git报错 error: cannot lock ref ‘refs/remotes/origin/master‘: unable to resolve reference ‘refs/remote

    使用sourceTree,拉取代码,提示错误: From http://111.11.111.7:10011//cp002000-1/djzcsgaaa/accobbting/yunasdfghtform    6dcfc7d2..55df1ffc  test       - origin/test error: cannot lock ref \\\'refs/remotes/origin/master\\\': unable to resolve reference \\\'refs/remotes/origin/master\\\': reference broken  ! [new branch]        master     - origin

    2024年02月04日
    浏览(51)
  • 解决python调用opencv时出现cannot find reference ‘imread‘ in __init__ 即cv.imread 未定义引用

    今天终于找到调用cv2未解析的解决办法了,几乎是把全网大多数方式都试了下,总的来说大致有三种原因: 一个是版本不匹配,python的版本和库文件的需求有出入导致无法使用。 一个是不同版本不兼容,下载过多个python版本可能导致这个问题 。 一个是路径设置,这可能不

    2024年02月08日
    浏览(60)
  • 【typeof instanceof Object.prototype.toString constructor区别】

    它返回的是一个字符串,表示未经过计算的操作数的类型 typeof操作符适合对基本数据类型以及function的检测进行使用,当然null除外,而对于引用数据类型,就比如说Array 和 Object等它是不适用的。 用于检测一个对象在其原型链中中是否存在一个构造函数的prototype属性 左操作数

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包