2016-11-09 7 views
-2

Wenn ich versuche, eine Methode aus einer anderen Klasse in meiner Hauptmethode aufzurufen, stoße ich auf den Fehler, der in diesem Titel beschrieben wird. Der Fehler zeigt auf die dritte Zeile meiner Klasse TestCalculator. Hier ist der Code:"Ausnahme im Thread" main "java.lang.StackOverflowError" Fehler?

TestCalculator Klasse

public class TestCalculator { 
     Double x; 
     TestCalculator c = new TestCalculator(); 
String string = "b"; 
Double doubleObject = 1.0; 
double doublePrimitive = 2; 


     /* 
     * Chops up input on ' ' then decides whether to add or multiply. 
     * If the string does not contain a valid format returns null. 
     */ 
     public Double x(String x){ 
      x("12 [ 3"); 
       return new Double(0); 
     } 
     public void testParsing() { 

     if (c.x(doubleObject) == 17) { 
      System.out.println("Adding Success");} 
      else { 
        System.out.println("Adding Fail"); 
        } 
     if (c.x(doublePrimitive) == 60) { 
      System.out.println("Multiplying Success");} 
      else { 
        System.out.println("Multiplying Fail"); 
        } 
     if (c.x(string) == null) { 
      System.out.println("Valid operator Success");} 
      else { 
        System.out.println("Valid operator Fail"); 
        } 
     } 
     /* 
     * Adds the parameter x to the instance variable x and returns the answer as a Double. 
     */ 
     public Double x(Double x){ 
       System.out.println("== Adding =="); 
       x("12 + 5"); 

       return new Double(0); 
     } 
     /* 
     * Multiplies the parameter x by instance variable x and return the value as a Double. 
     */ 
     public Double x(double x){ 
       System.out.println("== Multiplying =="); 
       x("12 x 5"); 

       return new Double(0); 
     } 
} 

Hauptklasse

public class Main { 

public static void main(String[] args) { 

TestCalculator call = new TestCalculator(); 
call.testParsing(); 

} 
} 

Ich bin mir nicht sicher, warum dieser Fehler auftritt. Wenn mir jemand helfen könnte zu verstehen, was dieser Fehler ist und warum es passiert, würde das von mir selbst und allen anderen, die auch in Zukunft auf dieses Problem stoßen könnten, sehr geschätzt werden. Vielen Dank.

+0

Sie rufen die Funktion immer wieder ohne Ende auf, welches Ergebnis erwarten Sie? – Li357

+0

Ich bin verwirrt darüber, wie Sie jeder Methode einen Wert zuweisen und dann diese Methode in der Hauptmethode aufrufen. Da alle Methoden denselben Namen haben, verwirren mich die Unterschiede zwischen diesen Methoden. – user7128699

+0

Was meinst du? – Li357

Antwort

1

Um dieses spezielle Problem zu beheben, eliminieren Sie Zeile 3 und entfernen Sie alle Verweise auf c in Ihrem Code. Wo Sie Dinge wie c.x(doubleObject) sagen, sollten Sie stattdessen einfach x(doubleObject) verwenden. Was Sie bauen, ist, selbst, ein TestCalculator, so dass es nicht notwendig ist, ein weiteres TestCalculatorinnerhalb davon zu erstellen.

Das wird den Fehler beheben, den Sie haben, aber es wird Sie auch sofort zu anderen Fehlern bringen, die in der Natur ziemlich ähnlich sind.

Auf einer sehr grundlegenden Ebene, rufen Sie nicht eine Funktion in sich selbst (wie x innerhalb x aufrufen) noch. Das ist eine spezialisierte Technik namens Rekursion, und es wird dir hier nicht helfen. Darüber hinaus geben Ihre Funktion den gleichen genauen Namen als Parameter übergeben werden. Damit meine ich, dass statt

public Double x(String x) 

Sie so etwas wie

public Double choose(String command) 

Andernfalls verwenden könnten, werden Sie verwirrt zwischen den beiden verschiedenen Anwendungen von x.

Innerhalb einer Funktion wie choose, haben Sie mit dem String zur Verfügung gestellt arbeiten, command und verwenden, wenn Aussagen und Java String-Funktionen, um herauszufinden, was command erfordert.

1

Sie können Ihre TestCalculator Klasse nach unten auf die folgende destillieren, die immer noch die StackOverflowError gibt (das ist, was durch eine Minimal, Complete, and Verifiable example gemeint ist):

public class TestCalculator { 
    TestCalculator c = new TestCalculator(); 
} 

public class Main { 
    public static void main(String[] args) { 
    new TestCalculator(); 
    } 
} 

Wenn Sie TestCalculator kompilieren, der Compiler wandelt diese in so etwas wie die folgenden:

public class TestCalculator { 
    TestCalculator c; 

    public TestCalculator() { 
    c = new TestCalculator(); 
    } 
} 

Denken Sie darüber nach, was passiert: im Konstruktor von TestCalculator, sind Sie eine neue Instanz von TestCalculator zu schaffen, Das ruft den Konstruktor TestCalculator auf. Wenn Sie den Konstruktor TestCalculator aufrufen, erstellen Sie eine neue Instanz von TestCalculator, die den Konstruktor TestCalculator aufruft.

Und in den Konstruktor von TestCalculator Aufrufen Sie eine neue Instanz von TestCalculator erstellen, die den Konstruktor von TestCalculator .... Sie nur aufrufen, wird

etc etc etc. Wenn Sie erstellen eine Instanz von TestCalculator, halten Beim Erstellen von Instanzen von TestCalculator wird jedes Mal ein weiterer Rahmen auf den Stapel geschoben. Irgendwann hast du keinen Speicherplatz mehr auf dem Stack und bekommst einen StackOverflowError.


Es gibt kein Problem ist, eine Referenz auf einen im Inneren TestCalculatorTestCalculator mit Atomen; und es gibt kein Problem beim Aufruf new TestCalculator() innerhalb TestCalculator. Das Problem ruft new TestCalculator() bedingungslos direkt oder indirekt im Konstruktor oder den Instanzinitialisierern der Klasse auf.

Die Lösung besteht darin, die TestCalculator c = new TestCalculator(); Zeile aus Ihrem Code zu entfernen; oder ändern Sie es zumindest in TestCalculator c; (d. h. lassen Sie es nicht initialisiert).

Verwandte Themen