Java 如何解决堆栈内存问题?

Java 如何解决堆栈内存问题?,java,android,Java,Android,我正在尝试构建一个android应用程序,它可以让用户在限定的时间内进行一些计算。代码运行良好,直到我将代码分为两部分并创建了另一个类来执行其他任务 我已将所有相应的包和类文件导入到新类中。代码中没有错误,但当我运行应用程序时,它崩溃了。我尝试过多次更改代码,但没有任何用处。当我将所有代码合并到一个类中时,代码运行良好 我得到的错误是“java.lang.StackOverflower错误:行号上的堆栈大小为8MB” Logic.java pac

我正在尝试构建一个android应用程序,它可以让用户在限定的时间内进行一些计算。代码运行良好,直到我将代码分为两部分并创建了另一个类来执行其他任务

我已将所有相应的包和类文件导入到新类中。代码中没有错误,但当我运行应用程序时,它崩溃了。我尝试过多次更改代码,但没有任何用处。当我将所有代码合并到一个类中时,代码运行良好

我得到的错误是“java.lang.StackOverflower错误:行号上的堆栈大小为8MB”

Logic.java

                         package e.nani.firstattempt;
                        import java.util.Random;

                        class Logic {
                            MainActivity s=new MainActivity();
                            public void operatio() {
                                try {
                                        Random n = new Random();
                                        int n1 = n.nextInt(4);
                                        int n2 = n.nextInt(4);
                                        int n3 = n.nextInt(4);
                                        int n4 = n.nextInt(4);

                                        s.a1 = n.nextInt(51);
                                        s.a2 = n.nextInt(35);
                                        s.option1 = n.nextInt((s.a1 + s.a2) + 1);

                                        s.option2 = n.nextInt((s.a1 + s.a2) + 1);
                                        s.option3 = n.nextInt((s.a1 + s.a2) + 1);
                                        s.option4 = s.a1 + s.a2;


                                        s.answers[n1] = s.option1;
                                        while (n2 == n1) {
                                            n2 = n.nextInt(4);
                                        }
                                        while (s.option2 == s.option1 || s.option2 == s.option4) {

                                            s.option2 = n.nextInt((s.a1 + s.a2) + 1);

                                        }


                                        s.answers[n2] = s.option2;
                                        while (s.option3 == s.option2 || s.option3 == s.option1 || s.option3 == s.option4)


                                        {
                                            s.option3 = n.nextInt((s.a1 + s.a2) + 1);
                                        }


                                        while (n3 == n2 || n3 == n1)

                                        {
                                            n3 = n.nextInt(4);
                                        }

                                        s.answers[n3] = s.option3;

                                        while (n4 == n2 || n4 == n1 || n4 == n3) {
                                            n4 = n.nextInt(4);
                                        }
                                        s.answers[n4] = s.option4;


                                        s.b1.setText(Integer.toString(s.answers[0]));
                                        s.b2.setText(Integer.toString(s.answers[1]));
                                        s.b3.setText(Integer.toString(s.answers[2]));
                                        s.b4.setText(Integer.toString(s.answers[3]));
                                        s.textview.setText(s.a1 + "+" + s.a2);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
这里的主要问题是,为什么当代码仅在主类中时应用程序工作正常,而当某些代码在其他类中编写时应用程序不工作?
谢谢。

在MainActivity中,您有一个变量c,其类型逻辑已实例化。 但在您的逻辑类中有MainActivity类型变量,该变量尝试实例化MainActivity类。简言之,在类a中实例化类B,它安装类a等等。。。 顺便说一下,您不能直接实例化AppCompatActivity类。 因此,删除
MainActivity s=newmainActivity()在Logic.class中


希望我能帮助您。

跟踪的确切错误是什么?java.lang.StackOverflower错误:第37行的堆栈大小为8MB…这是@carcigenicate的主要错误这两个方法是相互递归的,没有终止;剩下的应该是显而易见的?是的,我修好了。但是现在这一行**“s.b1.setText(Integer.toString(s.answers[0]);”**有一个错误。错误是登录类中这一行有一个空指针异常。错误是“尝试调用虚拟方法”s.b1.setText(Integer.toString(s.answers[0])”。有人能帮我一下吗?谢谢。@另一个Davethakyou,这是一个很好的解释。如何访问MainActivity.java中声明的变量值而不实例化它?我应该从逻辑类扩展MainActivity还是有其他方法@CSONGI77 MainActivity的唯一目的和职责是显示值(文本、图像等)。您应该制作一个ViewModel,其中包含在MainActivity中输入的逻辑和输入值。在这种情况下,当您的活动被破坏时,您不会丢失值(例如来电、将设备从纵向旋转到横向等)。简而言之,将逻辑与活动分开放入ViewModel。有关活动生命周期的详细信息,请参见ViewModel类:,
                         package e.nani.firstattempt;
                        import java.util.Random;

                        class Logic {
                            MainActivity s=new MainActivity();
                            public void operatio() {
                                try {
                                        Random n = new Random();
                                        int n1 = n.nextInt(4);
                                        int n2 = n.nextInt(4);
                                        int n3 = n.nextInt(4);
                                        int n4 = n.nextInt(4);

                                        s.a1 = n.nextInt(51);
                                        s.a2 = n.nextInt(35);
                                        s.option1 = n.nextInt((s.a1 + s.a2) + 1);

                                        s.option2 = n.nextInt((s.a1 + s.a2) + 1);
                                        s.option3 = n.nextInt((s.a1 + s.a2) + 1);
                                        s.option4 = s.a1 + s.a2;


                                        s.answers[n1] = s.option1;
                                        while (n2 == n1) {
                                            n2 = n.nextInt(4);
                                        }
                                        while (s.option2 == s.option1 || s.option2 == s.option4) {

                                            s.option2 = n.nextInt((s.a1 + s.a2) + 1);

                                        }


                                        s.answers[n2] = s.option2;
                                        while (s.option3 == s.option2 || s.option3 == s.option1 || s.option3 == s.option4)


                                        {
                                            s.option3 = n.nextInt((s.a1 + s.a2) + 1);
                                        }


                                        while (n3 == n2 || n3 == n1)

                                        {
                                            n3 = n.nextInt(4);
                                        }

                                        s.answers[n3] = s.option3;

                                        while (n4 == n2 || n4 == n1 || n4 == n3) {
                                            n4 = n.nextInt(4);
                                        }
                                        s.answers[n4] = s.option4;


                                        s.b1.setText(Integer.toString(s.answers[0]));
                                        s.b2.setText(Integer.toString(s.answers[1]));
                                        s.b3.setText(Integer.toString(s.answers[2]));
                                        s.b4.setText(Integer.toString(s.answers[3]));
                                        s.textview.setText(s.a1 + "+" + s.a2);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }