【问题标题】:StackOverflowError (java fx)StackOverflowError (java fx)
【发布时间】:2021-06-25 03:51:05
【问题描述】:

我正在编写一个代码,其中一个类用于绘制一条线,另一个类用于显示该线。该课程的重点是让我轻松编写多行代码并使我的代码更有条理。但是由于某种原因,每当我运行它时都会收到 StackOverflow 错误。我不确定为什么会这样。它还给了我一个 RunTimeException 和许多不同的错误消息,例如“应用程序启动方法中的异常”。我不确定这些应该是什么意思。

这是它给我的错误信息:

    Exception in Application start method
    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:873)
    Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: java.lang.StackOverflowError
    at Line.<init>(Main.java:133)
    at Line.<init>(Main.java:133)
    at Line.<init>(Main.java:133) //this just repeats a bunch of times
Exception running application Main

这是代码:

import javafx.scene.shape.Ellipse;
import javafx.scene.Node;
import javafx.scene.paint.Paint;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Rectangle;

class Line{

    public Line line;

    public Line(int x1,  int y1, int x2, int y2){

        Line line = new Line(x1, y1, x2, y2);
    }

    public void setFill(Paint p) {
        line.setFill(p);
    }

}

public class Main extends Application {
    private Pane root;
    @Override
    public void start(Stage primaryStage) {
        root = new Pane();

        Line line1 = new Line(250,250,450,450);

        root.getChildren().addAll((Collection<? extends Node>) line1);
        line1.setFill(Color.BLACK);

        Scene scene = new Scene(root, 500, 500);
        primaryStage.setTitle("Empty");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {

        Application.launch(args);
    }


}

【问题讨论】:

  • 你能发布错误的全文吗?所有的线。这将帮助我们了解正在发生的事情。
  • 你的代码中哪一行是 133?

标签: java javafx runtime javafx-8 stack-overflow


【解决方案1】:

那是因为这永远不会结束。

public Line(int x1,  int y1, int x2, int y2){

        Line line = new Line(x1, y1, x2, y2);
    }

在创建新对象时,您正在调用构造函数。在其中,它正在创建一个对象,这导致再次调用构造函数等等。
所以改为这样做:

class Line{

    int x1,x2,y1,y2;

    public Line(int x1,  int y1, int x2, int y2){

        this.x1 = x1;
        this.x2 = x2;
        this.y1 = y1;
        this.y2 = y2;
    }

}

您无需在导入时创建setFill() 函数。只需使用该功能。

【讨论】:

  • 谢谢!但是我现在有一个新问题,对于 setFill 方法,它说无法解析线符号
  • 又是同样的错误。该方法再次调用自身(递归)。它什么也没做。你能告诉我它应该做什么吗?
  • 你可以删除它,你不需要在导入时创建setFill()函数。只需使用该功能。
  • @ShawnHawkins 您尝试使用line.setFill(...) 让我觉得您尝试使用javafx.scene.shape.Line。但是你自己的班级被命名为Line。看到冲突了吗?重命名您的课程或在您使用它的任何地方使用 javafx.scene.shape.Line 的完全限定名称。
  • @ShawnHawkins 这也应该失败:root.getChildren().addAll((Collection&lt;? extends Node&gt;) line1);line1 不仅不是java.util.Collection,而且甚至不是javafx.scene.Node。请问您为什么定义自己的Line 类?为什么不直接使用javafx.scene.shape.Line
猜你喜欢
  • 2019-08-11
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多