2013-04-06 47 views
-1

我正在試圖製作一個帶有4個功能的計算器,這是基於字的。當我試圖實現選擇的操作時,我得到一個stackoverflow錯誤。製作基本的計算器時出現StackOverFlowError

類計算器:

package us.plexproductions.main; 

import java.util.Scanner; 

public class Calculator { 

public static int firstnum; 
public static int secondnum; 
public static int answer; 
public static int operation; 

Calculator c = new Calculator(); 
static Scanner s = new Scanner(System.in); 

static Operations o = new Operations(); 

public static void main(String[] args) { 

    prompt(); 
    start(); 
} 

public static void prompt() { 
    System.out.println("########################"); 
    System.out.println("#Calculator Version 1.0#"); 
    System.out.println("########################"); 
    System.out.println("************************"); 
    System.out.println("This is a calculator that\ncan add, subtract, multiply, and divide\n" + 
         "multiple numbers at once."); 
    System.out.println("------------------------"); 
    System.out.println("Start Calculating by Entering A Number and Then\nspelling out the operation you " + 
         "want to preform to that\nnumber and type in another number."); 
} 

public static void start() { 
    System.out.println("------------------------"); 
    System.out.println("Enter Your First Number: "); 
    firstnum = s.nextInt(); 
    System.out.println("------------------------"); 
    System.out.println("Which operation would you like to use?\nAddition = 1, Subtraction = 2, Multiplication = 3, or Division = 4?"); 
    operation = s.nextInt(); 
    second(); 

} 

public static void second() { 
    if (operation == 1) { 
     o.addition(); 
    } 
    if (operation == 2) { 
     o.subtraction(); 
    } 
    if (operation == 3) { 
     o.multiplication(); 
    } 
    if (operation == 4) { 
     o.division(); 
    } 
} 
} 

類操作:

package us.plexproductions.main; 

import java.util.Scanner; 

public class Operations { 

Calculator c = new Calculator(); 
Scanner s2 = new Scanner(System.in); 

public void addition() { 
    System.out.println("Addition Selected."); 
    System.out.println("Enter Second Number: "); 
    Calculator.secondnum = s2.nextInt(); 
} 

public void subtraction() { 

} 

public void multiplication() { 

} 

public void division() { 

} 
} 
+1

當你在調試器中執行代碼時會發生什麼?在這裏傾倒大量代碼並說「我得到了一個堆棧溢出錯誤,怎麼了?」並沒有顯示出很大的努力來解決你自己的問題。 (您可能會看到'Calculator c = new Calculator()'這個事實,''Class Calculator'開頭的'這似乎不是一個好主意。) – 2013-04-06 00:26:30

回答

6

Calculator每個實例創建針對字段c一個new Calculator()。這些Calculators依次創建更多Calculators,依此類推。

出現StackOverflowError是因爲對Calculator構造函數的調用順序永遠不會結束,從而填滿所有可用的堆棧內存。它似乎沒有需要嵌套Calculator,所以請嘗試刪除它。

1

A StackOverflowError發生在您撥打太多功能時,全部可用stack。它可能發生在被稱爲太多次的遞歸函數中。例如,下面的factorial功能溢出我的機器上:

public class Factorial { 
    public static int factorial(int n){ 
     if (n == 1) return 1; 
     return n * factorial(n-1); 
    } 

    public static void main(String[] args){ 
     factorial(10000); 
    } 
} 

現在,你在哪裏在代碼中使用遞歸?

public class Calculator{ 
    Calculator c = new Calculator(); 
    ... 
}