내 질문은 정적 메서드를 사용하여 비 정적 필드 초기화에 관한 것입니다. 기본적으로 내 코드는비 정적 필드 초기화
@NoArgsConstructor
@Builder
public class MyClass implements Callable<MyResultClass>{{
@Setter private MyService service;
List<MyType> myList =
Collections.synchronizedList(new ArrayList<MyType>());
//.... other fields methods and so on
}
내가 myList
는 (모든 메소드 호출에서)이 문 뒤에 널 나의 스팍 테스트 중에 발견이다. 생성자에서 초기화를 해결했지만 null 인 이유를 알아낼 수 없습니다. 아무도 나 에게이 동작 explane 수 있고, 가능한 경우, 정적 메서드를 사용하여 필드 초기화를 더 잘 이해할 수있는 몇 가지 참조를 제공합니까? 감사합니다.
여러분 모두 동의합니다. 여기서 잘못된 점을 이해하지 못합니다. 이 Callable 인스턴스를 생성하기 위해 lombok 빌더를 사용하고 있습니다. 여기 intellij2016
class InboundMessageListenerSpec extends Specification{
private MyService service = Mock(MyService)
given:
def myClassObject = MyClass.builder().service(service).build()
....other objects
when:
//stimulus that also starts the thread
then:
1 * service.myMethod()
}
에 문제 이런 스팍 테스트 실행이 시험 디버깅 때 그것은 널 동기화 된 목록을 사용하여이 (자극 방법) NullPointerException이 언제 발생 알 수 있다는 것이다.
정상적인 인스턴스 작성 및 필드 주입으로 빌더를 대체하려고 시도했지만 모두 aspected로 작동합니다. 나는 롬복 건축업자의 행동에 대해 조사 할 필요가있다.
스택 추적 :
java.lang.NullPointerException: null
at org.fw.adapters.secondary.NetworkInventoryDataAdapter.deleteCvlanRows(NetworkInventoryDataAdapter.java:111)
at org.fw.kernel.flows.executors.StartMigrationExecutor.call(StartMigrationExecutor.java:114)
at org.fw.kernel.flows.executors.StartMigrationExecutor.call(StartMigrationExecutor.java:34)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
라인 (111)은 상기에서 잘 알려진 문제이다
불가능합니다. 증거 좀주세요. 초기화 프로세스는 [Java 언어 사양 # 12.5] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5)에 정의되어 있습니다. – EJP
'mylist' 결과는 새로운 'MyClass'를 작성할 때 빈 목록이됩니다. – passion
어떻게하면 코드가 더 이상 널 (null)인지 확인 할 수 있습니까? – Aelexe