0

現在、ログ ファイルを作成して書き込む Java プログラムを作成しようとしています。

2 つのクラスがあります (1 つはリクエスト用、もう 1 つはワーカー コード用)。1 つのクラスにはテキストフィールドがあり、コマンドを入力できます。コマンドは「log start」または「log stop」のようにする必要があります。

したがって、リクエストクラスはコマンドを文字列として送信し、ワーカークラスはコマンドを取得して解析し、指示を実行します (ログの開始、ログの停止.

私の問題は、ユーザーが「停止」コマンドを入力しても、アプリケーションがログを停止しないことです。まあ、それは 3 つのログ エントリの後に停止しません (これが問題です。ユーザーがコマンドを入力するたびに停止したいのです)。コードを確認すると、問題がよりよく理解できます。

私はここで非常に基本的な間違いを犯していることを知っていますが、どういうわけか現在それを理解することができず、この問題についてあなたの意見を求めています. (問題がコードにあることを示しました)ありがとうございます。

エラー:

Exception in thread "stoplogging" java.lang.ArrayIndexOutOfBoundsException: 1
    at Response$ClientProcess$1StopperThread.run(Response.java:109)
    at java.lang.Thread.run(Unknown Source)

リクエストクラス:

public class Request extends JFrame {
private JTextArea consoleArea = new JTextArea();
private JTextField cmd_prompt = new JTextField();
private JLabel cmd_label = new JLabel("Enter command: ");

// ********IP PORT TEXTFIELDS & CONNECT BUTTON*******  !!!!

private DataOutputStream output; 
private DataInputStream input;


public static void main(String[] args) {
    new Request();
}

Socket socket = null;
String command;
public Request (){
    JPanel requestPanel = new JPanel();
    requestPanel.setLayout(new BorderLayout());
    setTitle("Project_3002_CLIENT");
    requestPanel.add(cmd_label, BorderLayout.WEST);
    requestPanel.add(cmd_prompt, BorderLayout.CENTER);
    setLayout(new BorderLayout());
    add(requestPanel, BorderLayout.NORTH);


    add(new JScrollPane(consoleArea), BorderLayout.CENTER);
    Font font = new Font("Courier New", Font.BOLD, 15);
    cmd_prompt.setFont(font);
    cmd_prompt.setAlignmentX(LEFT_ALIGNMENT);
    cmd_prompt.addActionListener(new TextFieldListener());
    setSize(600, 270);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    consoleArea.setFont(font);
    setVisible(true);

    String ip = "127.0.0.1"; // THIS WILL BE CHANGED (make custom) --extra jframe
    int port = 4588; // THIS WILL BE CHANGED (make custom) -- extra jframe
    try {
        socket = new Socket(ip, port);
        //IO connection stuff
        input = new DataInputStream(socket.getInputStream());
        output = new DataOutputStream(socket.getOutputStream());
    }
    catch (IOException ex) {
        consoleArea.append("Connection refused. Please check if the server is running.\n");
    }

}

class SenderThirty implements Runnable{

    Thread send30secs;
    public SenderThirty(){
    }

    public SenderThirty(String send30s){
        send30secs = new Thread(this, send30s);
        send30secs.start();
    }

    @Override
    public void run() {
        try {
            output.writeUTF(command);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

private class TextFieldListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        try {
            command = cmd_prompt.getText();

            if (command.contains("start") == true){

                Thread sendstart = new Thread(new SenderThirty(), "send");
                sendstart.start();
                //continue
            }

            else if (command.contains("stop") == true){
                Thread sendstop = new Thread(new SenderThirty(), "send");
                sendstop.start();
                //continue
            }

            else {consoleArea.append("\nInvalid command\n");}


        } catch (Exception e1) {
            consoleArea.append("\nERR!\n");
        }
    }
}}

ワーカー クラス:

public class Response {
String path = "";

public static void main(String[] args) throws InterruptedException {
    new Response();
}

ServerSocket resp_sock;
public Response() throws InterruptedException {

    int port = 4588;
    try {
        resp_sock = new ServerSocket(port);

        int clientNo = 1;

        while (true) {
            Socket socket = resp_sock.accept();


            // client's IP address
            InetAddress client_addr = socket.getInetAddress();

            ClientProcess task = new ClientProcess(socket);
            new Thread(task).start();

            clientNo++;
        }

    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }

}

class ClientProcess implements Runnable {

    private Socket socket; 

    public ClientProcess(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        try {
            final DataInputStream input = new DataInputStream(socket.getInputStream());//from client
            //DataOutputStream output = new DataOutputStream(socket.getOutputStream());//to client

            while(true){
                String prompt = input.readUTF();
                String command[] = prompt.split(" ");
                final Logger logger = Logger.getLogger("MyLog"); 
                FileHandler fh;             
                fh = new FileHandler("C:\\..path..\\logfile.log");  
                logger.addHandler(fh);                      
                SimpleFormatter formatter = new SimpleFormatter();  
                fh.setFormatter(formatter);




                class StopperThread implements Runnable{
                    public StopperThread(){
                    }           
                    @Override
                    public void run() { 
                        try { ////////////////////////////////////////***PROBLEM IS IN THIS TRY BLOCK***
                            String next_prompt;
                            next_prompt = input.readUTF();
                            String nextCommand[] = next_prompt.split(" ");

                            if(nextCommand[1].equalsIgnoreCase("stop")){
                                logger.info("STOPPED   " + new Date() + "  \n");
                                System.exit(0);}

                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                }}






                if(command[1].equalsIgnoreCase("start")){
                    try {

                        while(true){
                            logger.info("RUNNING   " + new Date() + "  \n");
                            Thread.sleep(5000);

                            Thread stoplogging = new Thread(new StopperThread(), "stoplogging");
                            stoplogging.start();

                        }

                    } catch (SecurityException e) {  
                        e.printStackTrace();  
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }  
                }


                if(command[1].equalsIgnoreCase("stop")){
                    logger.info("STOPPED   " + new Date() + "  \n");  
                }


            }
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }
    }

}}
4

1 に答える 1

0

if(nextCommand[1].equals...)犯人である可能性が高いです。

分割した文字列にスペース (" ") がない場合、NPE がスローされます。この場合、nextCommand の長さは 2 ではなく 1 になります。

事前に長さを確認する必要があります。注: と同じ潜在的なエラーcommand[1]

于 2012-07-07T07:18:19.207 に答える