8

最近,我在我的应用程序中添加了Detekt分析仪。

运行 detekt (./gradlew detekt) 后,我的主应用程序类中出现了 SpreadOperator 警告。

代码警告:runApplication<MessCallsApplication>(*args)

您可以在此处阅读有关 SpreadOperator 警告的信息:[SpreadOperator Warning][2]

我的主要课程:

@SpringBootApplication(exclude = [RedisAutoConfiguration::class])
@EnableCircuitBreaker
@EnableScheduling
class MyApplication {

    companion object : KLogging()
}

fun main(args: Array<String>) {
    Thread.setDefaultUncaughtExceptionHandler { _, exception ->
        MessCallsApplication.logger.error(exception) { "Uncaught exception" }
    }

    runApplication<MessCallsApplication>(*args)
}

问题是,摆脱该 SpreadOperator 警告的最佳做法是什么?还是不可能?

4

3 回答 3

5

在您的特定情况下:

 runApplication<MessCallsApplication>(args = args)

编辑:

这个检测警告不再是一个案例: https ://github.com/detekt/detekt/pull/3157

然而,正如 Klitos Kyriacou 在代码中提到的那样——这个数组被复制了(甚至两次!)。反编译字节码:

public final class MessCallsApplicationKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkNotNullParameter(args, "args");
      Schedulers.enableMetrics();
      String[] args$iv = (String[])Arrays.copyOf(args, args.length);
      int $i$f$runApplication = false;
      Intrinsics.checkExpressionValueIsNotNull(SpringApplication.run(MessCallsApplication.class, (String[])Arrays.copyOf(args$iv, args$iv.length)), "SpringApplication.run(T::class.java, *args)");
   }
}
于 2021-06-21T09:42:45.893 回答
5

您可以@Suppress("SpreadOperator")像这样在表达式之前添加:

@SpringBootApplication(exclude = [RedisAutoConfiguration::class])
@EnableCircuitBreaker
@EnableScheduling
class MyApplication {

    companion object : KLogging()
}

fun main(args: Array<String>) {
    Thread.setDefaultUncaughtExceptionHandler { _, exception ->
        MessCallsApplication.logger.error(exception) { "Uncaught exception" }
    }
    @Suppress("SpreadOperator")
    runApplication<MessCallsApplication>(*args)
}
于 2019-10-22T15:09:49.070 回答
1

或简单地改变:

fun main(args: Array<String>)

fun main(vararg args: String)
于 2021-09-27T06:55:48.750 回答