Nano Hash - криптовалюты, майнинг, программирование

Eclipse: отладка затем, кажется, останавливается в цикле while, без отладки следующих кодов, почему?

мои друзья, я должен признать, что вопрос немного длинный, но чтобы вы могли лучше понять вопрос, я вставил сюда коды, это некоторые коды 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();
        }
    

    }

я делаю скриншот, когда не могу продолжить отладку


  • И когда я попытался запустить программу на своем мобильном телефоне Android, программа долго не отвечала, мне пришлось принудительно закрыть ее. 15.02.2012

Ответы:


1

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

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

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

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

15.02.2012
  • спасибо, но у меня действительно есть предложение catch, IMO это не важно, поэтому я опустил его в коде, вы можете посмотреть на картинку, которую я показал выше. извините, просто чтобы сделать код более понятным, я отредактировал приведенный выше код, добавив предложение catch, чтобы избежать недоразумений. У вас есть другая идея? :) 15.02.2012

  • 2

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

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

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

    EDIT: не связано, но все же важно:
    Возможно, вы захотите избежать использования operator+ в строках в циклах. Он создает много объектов [каждый + создает новый объект]. Вы можете использовать StringBuilder. вместо этого и после того, как вы закончите создание своей строки, только затем преобразуйте ее обратно в строку,

    15.02.2012
  • спасибо, но у меня действительно есть предложение catch, IMO это не важно, поэтому я опустил его в коде, вы можете посмотреть на картинку, которую я показал выше. извините, просто чтобы сделать код более понятным, я отредактировал приведенный выше код, добавив предложение catch, чтобы избежать недоразумений. и спасибо за примечание StringBuilder. У вас есть другая идея? 15.02.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..