Eclipse: отладка ... затем, кажется, останавливается в цикле while, без отладки следующих кодов, почему? - PullRequest
1 голос
/ 15 февраля 2012

друзья мои, я должен признать, что вопрос немного длинный, но, чтобы вам было легче разобраться в этом вопросе, я вставил сюда коды, некоторые коды Android. Вам не нужно смотреть на это внимательно, это только ссылка. для некоторых функций кодов не работает, я начал отлаживать (используя Eclipse). все нормально до цикла while (я пометил его в коде), когда входите в цикл while, происходит нечто волшебное:

  1. первый цикл, после выполнения кода while((msg = d.readLine()) != null) значение переменной msg пустое, может быть, не null, потому что вы скоро войдете во второй цикл.
  2. второй цикл, после выполнения кода while((msg = d.readLine()) != null) значение переменной msg равно touchasd not found, да, это то, что я действительно хочу
  3. третий цикл, после выполнения кода while((msg = d.readLine()) != null), маленькая стрелка, которая указывает на текущую строку кода, исчезла! я не могу найти это нигде! а кнопка перешагнуть - серая! я даже не могу нажать на нее, чтобы продолжить отладку! так же, как отладка окончена! но у меня есть несколько кодов ниже, которые вообще не выполняются! ничего в logcat. кажется, что затмение думаю, что это нормально, без каких-либо ошибок.

        try {
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
        TextView suCommandMessage = (TextView)findViewById(R.id.suCommandMessage);
        BufferedReader d = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        outputStream.writeBytes("touchasd /m\n");
        String sb = "";
        String msg = "";
    
        /////////////////////////////////////HERE/////////////////////////////////////
    
        while((msg  = d.readLine()) != null) {
            sb = sb + msg;
        }
    
        /////////////////////////////////////HERE/////////////////////////////////////
    
        suCommandMessage.setText(sb);
        outputStream.writeBytes("exit \n");
        p.waitFor();
        } catch(IOException e) {
            new AlertDialog.Builder(this)
                           .setTitle("Exception")
                           .setMessage("IOException: " + e)
                           .setPositiveButton("OK", null)
                           .show();
        } catch(InterruptedException e) {
            new AlertDialog.Builder(this)
               .setTitle("Exception")
               .setMessage("InterruptedException: " + e)
               .setPositiveButton("OK", null)
               .show();
        }
    

    }

i make a screenshot when i cannot continue the debugging

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

99% случаев, когда у вас есть пустое предложение catch, вы получаете ошибку.

В очень редких случаях вы можете этого захотеть (я бы посоветовал добавить простой комментарий, объясняющий, почему это предложениепусто), во всех других случаях ... вы просто маскируете поведение, и вы потратите бесчисленные часы на отладку вещей, которые вы заметили бы сразу, если бы вы создавали / печатали исключение.

При этом добавьтеe.printStackTrace ();по крайней мере, к вашим предложениям catch.

Кроме того, вы можете добавить точку останова в Eclipse, которая останавливает выполнение при возникновении исключения (параметризовано как для перехваченных, так и для неперехваченных исключений).

0 голосов
/ 15 февраля 2012

Попробуйте обработать исключения , для начала - хотя бы используйте e.printStackTrace() в блоках исключений.

Возможно, было сгенерировано исключение, которое вывело вас из цикла, пропустив отмеченный цикл while и строки:

suCommandMessage.setText(sb);
outputStream.writeBytes("exit \n");
p.waitFor();

РЕДАКТИРОВАТЬ: Не связано , но все же важно:
Возможно, вы захотите избежать использования operator+ для строк в циклах. Он создает много объектов [каждый + создает новый объект]. Возможно, вы захотите использовать StringBuilder вместо этого, и после того, как вы закончите сборку вашей строки - только затем преобразовать ее обратно в строку,

...