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