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

Программа выдает ошибку переполнения стека

Следующая программа компилируется правильно. Что вызывает ошибку переполнения стека? Как исключение помещается в стек?

public class Reluctant {

    private Reluctant internalInstance = new Reluctant();

    public Reluctant() throws Exception {
        throw new Exception("I’m not coming out");
    }

    public static void main(String[] args) {
        try {
            Reluctant b = new Reluctant();
            System.out.println("Surprise!");
        } catch (Exception ex) {
            System.out.println("I told you so");
        }
    }
}

Ответы:


1

У вас есть код инициализации поля, который автоматически добавляется в тело конструктора компилятором javac. Эффективно ваш конструктор выглядит так:

private Reluctant internalInstance;

public Reluctant() throws Exception {
    internalInstance = new Reluctant();
    throw new Exception("I’m not coming out");
}

Поэтому он вызывает себя рекурсивно.

31.05.2015
  • просто знай это, твой ответ помогает! 31.05.2015
  • Не знал, что инициализация поля переходит в конструктор. Итак, если это первое становится заявлением, как вы упомянули. Исключение никогда не выбрасывается. Благодаря рекурсии. 31.05.2015
  • @Sorter: и если у вас есть несколько конструкторов, один и тот же код инициализации поля добавляется к каждому отдельному конструктору (сразу после инициализации суперкласса, но перед фактическим телом конструктора). 31.05.2015

  • 2

    Эта строка в вашем методе main приводит к бесконечной рекурсии:

    Reluctant b = new Reluctant();
    

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

    Вуаля, переполнение стека!

    31.05.2015
  • Это строка, с которой начинается рекурсия. 31.05.2015

  • 3

    У вас бесконечный цикл. Каждый экземпляр класса Reluctant создает экземпляр другого объекта Reluctant в объявлении internalInstance. Таким образом, когда вы создаете экземпляр первого объекта Reluctant в методе main, программа создает один экземпляр за другим, снова и снова, пока стек не переполнится.

    Замените эту строку.-

    private Reluctant internalInstance = new Reluctant();
    

    за

    private Reluctant internalInstance;
    
    31.05.2015
  • Хорошо объяснил процесс рекурсии. 31.05.2015
  • Новые материалы

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

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

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

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

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

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

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