Проблема выполнения - PullRequest
1 голос
/ 09 мая 2011

Я отладил свой код Java. Кажется, что нет никаких синтаксических или ЛОГИЧЕСКИХ ошибок. Но когда я выполняю код, он не завершается и не выдает никаких ошибок. Кто-нибудь, пожалуйста, помогите мне с другим способом справиться с этим?

Это мой сценарий оболочки -

echo "Name"
read name
if [ "$name" == "abcd" ]; then
 echo "correct name"
else
 echo "wrong name"
fi

echo "Password"
read password
if [ "$password" == "pwd" ]; then
 echo "Correct password"
else
 echo "Wrong password"
fi

echo "City"
read city
if [ "$city" == "bangalore" ]; then
 echo "correct city"
else
 echo "wrong city"
fi

Это мой код Java -

package Pack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import expectj.ExpectJ;
import expectj.Spawn;

public class Presentation extends Thread {

    public static StringBuffer execute(String cmd, List<Question> questions) {

        Utility u = new Utility();
        StringBuffer sb = new StringBuffer();
        ExpectJ exp = new ExpectJ();
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String answer = null;
        cmd = "sh /root/Desktop/details.sh";
        try {
            Spawn s = exp.spawn(cmd);
            Question q = null;
            int i = 0;
            while (i <= questions.size()) {
                System.out.println("iteration " + i);
                q = questions.get(i);
                try {
                    if (s.getCurrentStandardOutContents().contains(
                            q.getQuestion())) {
                        i++;
                    }
                    s.expect(q.getQuestion(), q.timeoutInSec);
                    if (q.isInteractive) {
                        System.out.println("Please provide your input: ");
                        answer = br.readLine();
                    } else {
                        if (q.isAnswerEncrypted) {
                            // TODO: decrypt the answer
                        } else {
                            answer = q.getAnswer();
                        }
                    }
                    s.send(answer + "\n");
                    i++;
                    try {
                        s.expectClose(3);
                        System.out.println("Script completed");
                        break;
                    } catch (Exception e) {

                    }
                } catch (Exception e) {
                    System.out.println("Timeout!!!Please answer "
                            + s.getCurrentStandardOutContents());
                    try {
                        answer = u.PromptUserForAnswerInCaseOfException();
                        s.send(answer + "\n");
                    } catch (IOException ioe) {
                        System.out.println("IO Exception..");
                    }
                }
            }
            s.expectClose();
        } catch (IOException ioe) {
            System.out.println("No more communication due to the lack of data");
        } catch (Exception e) {

        }
        return sb;
    }

    public static void main(String[] args) {

        String cmd = "sh /root/Desktop/details.sh";
        List<Question> questions = new ArrayList<Question>();

        Question question1 = new Question();
        question1.setQuestion("Name");
        question1.setIsInteractive(false);
        question1.setAnswer("abcd");
        question1.setIsAnswerEncrypted(false);

        Question question2 = new Question();
        question2.setQuestion("Password");
        question2.setIsInteractive(true);
        question2.timeoutInSec = 5;
        question2.setAnswer("pwd");
        question2.setIsAnswerEncrypted(false);

        Question question3 = new Question();
        question3.setQuestion("City");
        question3.setIsInteractive(false);
        question3.timeoutInSec = 5;
        question3.setAnswer("bangalore");
        question3.setIsAnswerEncrypted(false);

        questions.add(question2);
        questions.add(question1);
        questions.add(question3);

        System.out.println(questions.toString());
        try {
            execute(cmd, questions);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Редактировать: Относительно вашей программы:

while (i <= questions.size()) звонит в колокола. Когда переменная i равна questions.size(), вы уже достигли конца списка. questions.get(i) сгенерирует исключение, потому что вы пытаетесь читать вне списка. Предложение должно читаться как while (i < questions.size().

Исходное сообщение: это совет о том, как отлаживать программу, которая кажется «застрявшей в цикле»:

Если вы работаете в IDE, такой как Eclipse, вы можете «приостановить» программу, которую вы сейчас отлаживаете. Затем, взглянув на стек вызовов, вы увидите, где находится точка выполнения. Если это системный метод, вы можете «настроить возврат», пока точка выполнения не достигнет вашего кода.

1 голос
/ 09 мая 2011

Если в вашем цикле возникает исключение, оно никогда не закончится, так как у вас нет break.Возможно, вы могли бы вместо этого использовать цикл for.

...