그래서 생성자에서 DatagramSocket
을 초기화하려고하는데이 필드가 final
이 되길 원하지만 내 컴파일러 (예 : Eclipse)는 나에게 다음 오류 :생성자 내의 try-catch 블록에서 최종 필드 할당하기
The blank final field datagramSocket may not have been initialized
이것은 이해할 수 있습니다. 코드 스 니펫은 다음과 같습니다.
public class Foo
{
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo()
{
synchronized(this)
{
try
{
datagramSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
catch (SocketException e)
{
// Log error
logger.error("Trouble opening UDP port: ", e);
}
}
}
}
이제 이것을 우회하는 방법이 있지만 임시 변수를 만들어야합니다.
public class Foo
{
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo()
{
synchronized(this)
{
DatagramSocket tempSocket = null;
try
{
tempSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
catch (SocketException e)
{
// Log error
logger.error("Trouble opening UDP port: ", e);
}
datagramSocket = tempSocket;
}
}
}
그래서, 내 질문은 가정 :이 일을 더 우아한 방법이 있나요, 아니면 그냥 내가 원하는 경우 살 해야이 뭔가 여기에 코드입니다 그 필드는 final
이 될까요?
편집 : 관심이있는 분들을 위해
, 여기에 내가 당신의 권고에서 함께했다 솔루션입니다 :
public class Foo
{
private static final Foo INSTANCE;
static
{
try
{
INSTANCE = new Foo();
}
catch (SocketException e)
{
throw new ExceptionInInitializerError(e);
}
}
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo() throws SocketException
{
synchronized (this)
{
datagramSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
}
public static Foo getInstance()
{
return INSTANCE;
}
}
날이 올 알고, 또는 경우 주시기 바랍니다 다른 제안이 있습니다. 도움에 감사드립니다!
질문 : SocketException의 경우에는 어떻게해야합니까? –
글쎄, 그건 일종의 부적절한 일이지만, 지금은 응용 프로그램이 사용자에게 알리고 그 다음에 종료되도록 처리합니다. – mre
관련성이 있습니다 : SocketException의 경우, tempSocket은 여전히'null'이고'datagramSocket'도 마찬가지입니다. 아마도 당신이 원하는 것이 아니기 때문에 @ 칼의 해결책이 당신이 정말로 원하는 것일 수 있습니다. –