سؤال

يتم استخدام الفئة التالية من قبل برنامج آخر. عند الوصول إليها، فإنه يلقي stackoverflowerror. هذا جزء من آلة حاسبة postfix علي أن أفعل كمشروع في جامعتي.

أي مساعدة سيكون موضع تقدير كبير، شكرا لك مقدما. أنا جديد جدا في جافا وليس لدي أي فكرة عما يجب القيام به.

الشفرة:

import java.util.Queue;
import java.util.Stack;

public class MyPostfixMachine implements PostfixMachineInterface {

    MyMathOperations mmo = new MyMathOperations();
    MyPostfixMachine mpm = new MyPostfixMachine();

    public String evaluate(Queue q) {
        if (q.isEmpty()) {//if the input is empty, terminate the program
            System.exit(0);
        }
        if (q.size() == 1) {//if there is only one number in the queue, return it as the solution
            if (mpm.isParsableToDouble(String.valueOf(q.remove()))) {
                return String.valueOf(q.remove());
            }
        }
        Stack<String> finalxp = new Stack<String>();//create an empty stack
        if (mpm.isParsableToDouble(String.valueOf(q.remove()))) {//if first element of queue q is a number,push it into the stack
            finalxp.push(String.valueOf(q.remove()));
        } else {//depending on the operator perform the corresponding operations
            if (q.remove() == "+") {
                String str = String.valueOf(finalxp.pop());
                String str2 = String.valueOf(finalxp.pop());
                finalxp.push(mmo.addition(str, str2));
            }
            if (q.remove() == "-") {
                String str = String.valueOf(finalxp.pop());
                String str2 = String.valueOf(finalxp.pop());
                finalxp.push(mmo.substraction(str, str2));
            }
            if (q.remove() == "*") {
                String str = String.valueOf(finalxp.pop());
                String str2 = String.valueOf(finalxp.pop());
                finalxp.push(mmo.product(str, str2));
            }
            if (q.remove() == "/") {
                String str = String.valueOf(finalxp.pop());
                String str2 = String.valueOf(finalxp.pop());
                finalxp.push(mmo.division(str, str2));
            }
            if (q.remove() == "fibo") {
                String str = String.valueOf(finalxp.pop());
                finalxp.push(mmo.fibonacci(str));
            }
            if (q.remove() == "fac") {
                String str = String.valueOf(finalxp.pop());
                finalxp.push(mmo.factorial(str));
            }
            if (q.remove() == "han") {
                String str = String.valueOf(finalxp.pop());
                finalxp.push(mmo.hanoi(str));
            }
        }
        return String.valueOf(finalxp.pop());
    }

    public boolean isParsableToDouble(String candidate) {
        try {
            Double.parseDouble(candidate);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }
}





public class MyMathOperations implements MathOperationsInterface {

public String addition(String s1, String s2) {

    double A = Double.parseDouble(s1);
    double B = Double.parseDouble(s2);

    return String.valueOf((A + B));
}

public String substraction(String s1, String s2) {
    double A = Double.parseDouble(s1);
    double B = Double.parseDouble(s2);

    return String.valueOf((A - B));
}

public String product(String s1, String s2) {
    double A = Double.parseDouble(s1);
    double B = Double.parseDouble(s2);

    return String.valueOf((A * B));
}

public String division(String s1, String s2) {
    double A = Double.parseDouble(s1);
    double B = Double.parseDouble(s2);

    return String.valueOf((A / B));
}

public String fibonacci(String s) {
    int n = Integer.parseInt(s);
    return String.valueOf(fibo(n));
}

public int fibo(int f) {
    if (f < 0) {
        throw new IllegalArgumentException("Cannot apply Fibonacci method");
    } else if (f == 0) {
        return 0;
    } else if (f == 1) {
        return 1;
    } else {
        return fibo(f - 1) + fibo(f - 2);
    }

}

public String hanoi(String s) {
    int a = Integer.parseInt(s);
    int han = 0;
    if (a < 0) {
        throw new IllegalArgumentException("Not a valid integer");
    } else {
        han = (int) Math.pow(2, a) - 1;
    }
    return String.valueOf(han);
}

public String factorial(String s) {
    int a = Integer.parseInt(s);

    if (a < 0) {
        throw new IllegalArgumentException("Incorrect argument for factorial operatiion");
    }
    switch (a) {
        case 0:
        case 1:
            return String.valueOf(1);
        default:

            int res = a;
            while (true) {
                if (a == 1) {
                    break;
                }

                res *= --a;
            }
            return String.valueOf(res);
    }

}

private static double pDouble(String s) {
    double res = 0d;
    try {
        res = Double.parseDouble(s);
    } catch (NumberFormatException e) {
        System.exit(1);
    }

    return res;
}

}

هل كانت مفيدة؟

المحلول

المشكلة هي أن الخاص بك فئة mypostfixmachine. لديه مجال خاص mypostfixmachine mpm. التي تتم تهيئتها مع جديد mypostfixmachine.. وبعد نظرا لأن هذا mypostfixmachine الجديد يحتوي أيضا على حقل خاص mypostfixmachine mpm الذي تتم تهيئته مع mypostfixmachine جديد ... تحصل عليه. :) هذا يستمر وعلى الأبد (أو حتى كتمك ممتلئ).

هنا هو جزء من التعليمات البرمجية

public class MyPostfixMachine implements PostfixMachineInterface {

    MyMathOperations mmo = new MyMathOperations();
    MyPostfixMachine mpm = new MyPostfixMachine(); // problem is here

    // ...
}

أعتقد أنه يمكنك ببساطة إزالة الحقل الخاص MPM. فقط اتصل بالطرق على المثيل الحالي. لذلك بدلا من:

if (mpm.isParsableToDouble(String.valueOf(q.remove()))) {...}

يمكنك ببساطة كتابة:

if (isParsableToDouble(String.valueOf(q.remove()))) {...}

أو (متباين ولكن أكثر صراحة):

if (this.isParsableToDouble(String.valueOf(q.remove()))) {...}

على أي حال، فقط قم بإزالة الحقل الخاص MPM ويجب أن يختفي StackoverFlowException.

نصائح أخرى

لست متأكدا من كيفية الحصول على Stackoverflowerror (لا أرى أي حلقات أو قوائم في هذا الرمز)، ولكن مشكلة واحدة محددة هي الإفراط في استخدامك Queue.remove(). وبعد في كل مرة تنظر فيها إلى قائمة الانتظار في if البنود، أنت تنتهك العنصر الأول - أتوقع أن يكون هذا الرمز بارفينغ NoSuchElementExceptionس.

لنقول شيئا من كل EmptyStackExceptionيجب أن تحصل من ظهرت من فارغة Stack.

لذلك أنا أقول ....

  1. قم بإنهاء الدعوة `إزالة ()` عندما يجب أن تتصل ب "نظرة خاطفة ()` بدلا من ذلك.
  2. إنهاء ظهرت من مكدس فارغ؛ تريد أن تسحب تلك القيم من قائمة انتظار الإدخال الخاصة بك، نعم؟
  3. المشكلة التي تعطيك `stackoverflowror` هو في أي مكان آخر. (ما لم أطلني شيئا ما - دائما ممكن!) ابحث عن حلقة أو مكالمة متكررة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top