私はこの忌まわしい構造を持っています:
public void run() {
try {
if (!portField.getText().equals("")) {
String p = portField.getText();
CharSequence numbers = "0123456789";
btnRun.setEnabled(false);
if (p.contains(numbers)) {
ServerSocket listener = new ServerSocket(Integer.parseInt(p));
while (true) {
Socket socket = listener.accept();
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hi there, human.");
} finally {
socket.close();
}
}} else {
JOptionPane.showMessageDialog(null, "Only numbers are allowed.");
}
}
} catch (NumberFormatException | HeadlessException | IOException e) {
e.printStackTrace();
}
}
ご覧のとおり、ソケットで行ったのとまったく同じように、リスナーを閉じる必要があります。問題は、ループ後にそうしようとすると、コードが「到達不能」になり、ServerSocket の任意の場所でフィールドを宣言しようとすると、NullPointerException が発生することです。新しい接続を作成したいので、ソケット/クライアントと一緒に ServerSocket を閉じたくありません。
それが私の質問です:
この場合、ServerSocket を閉じることが本当に必要ですか? ソフトウェアがシャットダウンされると、ServerSocket は自動的に閉じますか? (System.exit(0)) . ソフトウェアを閉じていないという理由だけでソフトウェアを閉じても ServerSocket が実行され続ける場合は、その血まみれのコードに到達して閉じることができないため、問題が発生します:)。