2016-11-09 5 views
-2

私のメインメソッドで別のクラスのメソッドを呼び出そうとしているとき、そのタイトルに記述されているエラーを見つけようとしています。エラーは、私のクラスTestCalculatorの3行目を指しています。ここでは、コードは次のとおりです。"スレッド内の例外" main "java.lang.StackOverflowError"エラー?

TestCalculatorクラス

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); 
     } 
} 

メインクラス

public class Main { 

public static void main(String[] args) { 

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

} 
} 

私はこのエラーが発生している理由として、あまりにもわかりません。誰かがこのエラーが何であるのか、なぜそれが起こっているのか理解するのを助けることができれば、それは自分自身と将来この問題を遭遇する可能性のある他の誰もが高く評価します。ありがとう。

+0

あなたは何度も何を期待していますか? – Li357

+0

私は、各メソッドに値を代入し、そのメソッドをmainメソッドで呼び出す方法を混同しています。すべてのメソッドが同じ名前を持つので、これはそれらのメソッドを区別する方法を私に混乱させます。 – user7128699

+0

どういう意味ですか? – Li357

答えて

1

この特定の問題を解決するには、3行目を削除し、コード内のcへの参照を取り除きます。 c.x(doubleObject)のようなものは、代わりにx(doubleObject)を使用してください。あなたが構築しているのはそれ自体、TestCalculatorなので、別のTestCalculatorの中に作成する必要はありません。

これにより、発生しているエラーは修正されますが、すぐに他のエラーに似ています。

非常に基本的なレベルでは、(xxの中で呼び出すのと同じように)それ自体の中で関数を呼び出さないでください。これは、という再帰的な特殊な手法で、です。ここでは役立たないでしょう。また、あなたの関数に渡されるパラメータと同じ名前を正確に与えることはありません。このことで、私の代わりに

public Double x(String x) 

のあなたがそうでなければ

public Double choose(String command) 

のようなものを使用するかもしれないことを、あなたがすることを意味しxの2つの異なる用途の間で混乱します。 chooseのような関数内

は、あなたが提供する文字列、commandと仕事をしなければならない、と文とJavaの文字列関数場合commandが必要となるかを把握するために使用します。

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

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

あなたがTestCalculatorをコンパイルすると、コンパイラのようなものにこれを変換します

1

あなたはまだStackOverflowErrorを与える以下、までごTestCalculatorクラスを蒸留することができますが(これはMinimal, Complete, and Verifiable exampleによって意味されるものです)次

public class TestCalculator { 
    TestCalculator c; 

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

何が起こるかを考えてみて:TestCalculatorのコンストラクタで、あなたはTestCalculatorの新しいインスタンスを作成しています、 TestCalculatorのコンストラクタが呼び出されます。

TestCalculatorのコンストラクタを呼び出すと、TestCalculatorという新しいインスタンスが作成され、TestCalculatorのコンストラクタが呼び出されます。

そしてTestCalculatorのコンストラクタを呼び出すことで、あなたはTestCalculatorのコンストラクタを呼び出すなる、TestCalculatorの新しいインスタンスを作成します....

などなどなど、あなたがTestCalculatorの1つのインスタンスを作成する場合は、あなただけの維持TestCalculatorのインスタンスを作成するたびに、もう1つのフレームをスタックにプッシュします。最終的には、スタックの空き領域がなくなり、StackOverflowErrorとなります。


TestCalculator内部TestCalculatorへの参照を有する問題はありません。 の中にnew TestCalculator()を呼び出すことに問題はありません。この問題は、クラスのコンストラクタまたはインスタンスの初期化子に直接または間接的にnew TestCalculator()を無条件に呼び出すことです。

解決方法はコードからTestCalculator c = new TestCalculator();行を削除することです。少なくとも、TestCalculator c;に変更してください(つまり、初期化されていないままにしておきます)。

関連する問題