2016-03-13 2 views
-1

Мой учитель заставляет нас выполнять эти назначения исправления ошибок, и я просто не могу исправить это. Вот почему я пришел сюда. Я хочу спросить одну услугу и несколько вопросов.Как исправить java.lang.StackOverflowError

Вопросы: Что означает сообщение об ошибке в деталях (я просто хочу узнать из-за своего собственного любопытства), Почему это происходит специально с использованием моего кода, Как я могу исправить это

Оплатить: Можете ли вы исправить мой код, Извините, если это похоже на способ получить ответ, но я немного потерян.

Вот код

public class Recursion 
     { 
     public static void indifferent(int x, int y) 
      { 

      System.out.print(x); 
       indifferent(x - 1, y + 2); 
       System.out.print(y); 

     } 
    } 

     public class RecursionDriver//-the driver class 
     { 
      public static void main(String [] args) 
      { 

      Recursion.indifferent(7, -1); 

      } 
     } 
+0

Что такое 'Recursion.indifferent()' предполагается делать? В настоящее время он выполняет бесконечную рекурсию, и стек заканчивается, что и означает сообщение об ошибке. – MikeCAT

+3

Ответ на ваш вопрос «Можете ли вы исправить мой код» - да, я могу. Но я не буду. Это не сайт «сделай мою домашнюю работу для меня». –

+0

Ну, я не совсем уверен, что безразлично, потому что это то, что мой учитель сказал нам, чтобы он назвал это имя классом (она сказала, что его бессмысленно и говорит нам, чтобы игнорировать ее) – Ineedhelp

ответ

3

Если вы исследуете код это должно быть очевидно, что она никогда не может завершиться. Каждый звонок до indifferent делает еще один звонок indifferent. Безоговорочно.

StackOverflowError происходит потому, что вложенные вызовы стали слишком глубокими. Вызов метода Java использует стек для хранения локальных переменных (и обратного адреса и других данных). Стек имеет фиксированный размер. Если у вас слишком много вложенных вызовов, стек переполняется.

Как это исправить? Перепишите код, чтобы делать то, что он сейчас делает, но без с использованием рекурсии.

Но сначала вам нужно понять, что он делает. Как ты это делаешь? Ну ... в основном ... вы читаете код.

Ну я не совсем уверен, что равнодушен средства, потому что это то, что мой учитель сказал нам поставить в качестве имени для класса (она сказала его бессмысленным и сказал нам, чтобы игнорировать его)

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

+0

Для рекурсии нам всегда нужен базовый корпус? Зачем? или почему бы и нет?Я хотел знать, потому что я спросил у своего учителя по электронной почте, и она упомянула, что основной случай был важен, но я не понимаю, почему это должно предотвратить эту точную ошибку? – Ineedhelp

+0

Если базового футляра нет, то рекурсия будет продолжаться вечно. Думаю, это делает его важным ... не так ли. Подсказка: Google для «случая базы рекурсии». –

0

В рекурсии вы пытаетесь разделить вашу проблему в подсистемах и попытаться вычислить результат. Следовательно, в рекурсии вы всегда должны иметь базовый регистр. Базовый регистр на конечной глубине вашей рекурсии. Как только вы достигнете базового варианта, вы начнете выходить из рекурсии и получите окончательный ответ.

В коде:

public static void indifferent(int x, int y) 
{ 
     System.out.print(x); 
     indifferent(x - 1, y + 2); 
     System.out.print(y); 
} 

Вы не базовый случай, сделать ваш код просто продолжает идти глубоко в рекурсии.

public static void indifferent(int x, int y) 
    { 
      if(x == 1) //example of a base case 
       return; 
      System.out.print(x); 
      indifferent(x - 1, y + 2); 
      System.out.print(y); 
    } 
Смежные вопросы