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

这篇具有很好参考价值的文章主要介绍了Cannot Reference “XxxClass.xxx” 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.xxx” 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.xxx” 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-484266.html

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

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

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

相关文章

  • java.lang.Class<...> has no zero argument constructor。registerReceiver(myBroadcastReceiver, filter)。

    写在前面:确切的说,这是采过的坑,记录的日志。或许,至今还在坑中,而不自知…… 出现问题的起因:自定义了一个广播,并发送广播。 然后在另一个Activity中接收广播。 在注册广播时:registerReceiver(myBroadcastReceiver, filter);黄标报错。 就像这样: 提示: `myBroadcastRece

    2024年02月21日
    浏览(27)
  • 【springboot项目运行报错】亲测有效 Parameter 0 of constructor in xxx.xxx.Controller required a bean o

    更新项目以后,新增了许多java类,运行application来启动项目时报错: 刚开始以为是文件DictDetailService不存在,结果不是,删除再导入后也解决不了问题。最终靠以下步骤解决: 点击界面左侧的maven管理,再点击root下的生命周期,点击clean (也可以直接控制台运行 mvn clean,一

    2024年02月16日
    浏览(62)
  • 请求500失败-No primary or single unique constructor found for interface xxx

    错误:No primary or single unique constructor found for interface java.util.List(没有为List接口找到主要的或唯一的构造函数) 原因:请求的参数没有匹配上处理函数的参数 解决:为List参数添加@RequestParam(\\\"strList\\\")指定参数名称即可 附加:本接口为测试异常接口,一般多个参数会封装为一个入

    2024年02月12日
    浏览(51)
  • 解决报错Parameter 0 of constructor in XXX required a bean...elasticsearch 继承ElasticsearchConfiguration方法

    报错内容 报错信息是由于ElasticsearchRestTemplate中定义了含参数的构造函数,Spring自动构造和注入时未为该Bean传入参数,引起报错。 解决方案:使用@Bean注解手动创建ElasticsearchRestTemplate的实例,具体步骤如下: 在ElasticRestClientConfig extends AbstractElasticsearchConfiguration里面添加方法

    2024年02月11日
    浏览(40)
  • 已解决RuntimeError: An attempt has been made to start a new process before the current process has fi

    已解决RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. 这个错误通常是由于在程序启动阶段尝试启动新的进程引起的。 下滑查看解

    2024年02月04日
    浏览(63)
  • java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor at org.springf

      java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor     at org.springframework.security.core.userdetails.User.init(User.java:113)     at org.springframework.security.core.userdetails.User$UserBuilder.build(User.java:535)     at com.example.mz.spingsecurity_jwt_deepstudy.SpingsecurityJwtDeepstudyApplicationTests.tes

    2024年02月04日
    浏览(48)
  • Dev C++中出现 undefined reference to XXX 错误的解决方式

            主函数中调用在其他文件中定义的函数,编译报错:未定义的引用xxx。         原理:编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这4个过程,这个问题一般出现在 链接 过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一

    2024年02月03日
    浏览(42)
  • 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)
  • 解决:Member reference base type ‘XXX‘ is not a structure or union

    在编译 C++ 代码时,如果出现“Member reference base type ‘XXX’ is not a structure or union”的错误,可能是因为使用了 C++11 的新特性,而当前编译器的标准并不支持这些新特性,导致编译出错。为了解决这个问题,你可以尝试采取以下措施: 将代码中使用 C++11 的新特性改为标准 C+

    2024年02月16日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包