저는 간단한 Java 메시징 프로그램을 작업 중입니다. 더 복잡한 기능에 대한 작업을 시작하기 전에 기본 시스템이 작동하도록하고 싶습니다. 현재
이 코드는 특히 오류를 일으키는 것으로 보입니다. 내 ClientThread.java 스레드의 run () 메서드 (실행 가능을 구현)입니다. 이 스레드는 서버에서 들어오는 메시지를 처리하기위한 것입니다 (메시지 보내기는 정상적으로 작동 함).
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class ClientThread implements Runnable{
private Socket server;
private DataInputStream in;
private DataOutputStream out;
public Text msgContent;
public void login(Stage stage, Scene main, String username, String password, String portString, String host) {
try {
int port = Integer.parseInt(portString);
this.server = new Socket(host, port);
this.in = new DataInputStream(server.getInputStream());
this.out = new DataOutputStream(server.getOutputStream());
stage.setScene(main);
Platform.runLater(new ClientThread());
}
catch (NumberFormatException e) {
System.out.println("Invalid Port");
return;
}
catch (IOException e) {
System.out.println("Error Connecting to Server");
return;
}
}
public void run() {
String msg = "";
try {
while (true) {
msg = in.readUTF(); //This line gives Errors
System.out.println("Read message from server");
msgContent.setText(msgContent.getText() + msg + "\n");
System.out.println("Added message from server to view");
}
}
catch(Exception ioe) {
ioe.printStackTrace();
System.out.println("Failed to read message from server and add to view.");
}
}
public void sendMsg(String msg) {
try {
out.writeUTF(msg);
} catch (Exception ioe) {
ioe.printStackTrace();
}
}
}
msgContent는 JavaFX 프런트 엔드와 서버의 inputStream에있는 Text 객체입니다. 내 전체 코드는 여기에 있습니다 . 내가 얻는 오류는
com.sun.javafx.application.PlatformImpl $ 6 $ 1.run (Unknown Source)의 ClientThread.run (ClientThread.java:42)의 java.lang.NullPointerException at com.sun.javafx.application.PlatformImpl $ 6 $ 1.run (Unknown Source) at java.security.AccessController.doPrivileged (Native Method) at com.sun.javafx.application.PlatformImpl $ 6.run (Unknown Source) at com.sun.glass.ui.InvokeLaterDispatcher $ Future.run (Unknown Source) at com.sun.glass.ui.win.WinApplication._runLoop (Native Method) : com.sun.glass.ui.win.WinApplication.access $ 300 (Unknown Source) at com.sun.glass.ui.win.WinApplication $ 4 $ 1 .run (Unknown Source) at java.lang.Thread.run (Unknown Source) 서버에서 메시지를 읽고보기에 추가하지 못했습니다.
또한이 메서드를 실행하기 위해 Platform.runLater ()를 사용하고 있습니다. 내 코드가 작동하도록 위의 오류를 수정하는 방법을 알고 싶습니다. 미리 감사드립니다.
NullPointer 예외의 원인
in
null입니다.
NullPointerException이 발생하는 이유는이 호출에서 ClientManager 클래스의 새 인스턴스를 생성하기 때문입니다. Platform.runLater(new ClientThread());
, 따라서 in
및 out
멤버를 초기화 한 ClientManager의 기존 인스턴스를 사용하지 않습니다 . 대신,를 사용 Platform.runLater(this);
하여 NullPointerException을 제거 할 수 있습니다 .
그러나 코드에는 다른 문제가 있습니다.
잘못된 동시 프로그래밍
응용 프로그램이 UI 입력에 대한 렌더링 또는 응답을 중지하는 JavaFX 응용 프로그램 스레드를 중단합니다. JavaFX 응용 프로그램 스레드를 기다리지 마십시오.
수행하려는 작업을 수행하는 한 가지 방법은 JavaFX 동시성 유틸리티 , 특히 작업을 사용하는 것 입니다.
자체 스레드에서 작업을 실행하면 루프를 수행하여 입력을 영원히 받아들이고 UI 스레드를 차단하지 않습니다. 다른 모든 데몬 스레드가 완료되면 자동으로 종료되도록 스레드를 데몬이 아닌 스레드로 만들 수 있습니다. Platform.runLater를 사용하여 입력을 UI에 다시 공급할 수 있습니다. 그러나 일부 메시지 텍스트를 업데이트하려는 위치에 제공 한 간단한 예제의 경우 대신 updateMessage 를 호출 할 수 있습니다 (태스크 클래스가 이러한 종류의 세부 정보를 처리하므로 Platform.runLater 호출이 필요하지 않습니다). 메시지 레이블을 업데이트하려면 해당 텍스트 속성을 작업의 메시지 속성에 바인딩 할 수 있습니다. 태스크 javadoc에이를 수행하는 방법에 대한 예제가 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다