0

我在serialVersionUID 的行中有一个语法错误。为了解决这个错误,我必须在该行的末尾放置一个括号并在我的代码末尾关闭它......我的问题是为什么?在包含 Jframe 的文件中不需要这个......还有什么是 serialVersionUID?如果我的问题看起来很初级,我很抱歉,我是编程新手,Java 新手,这是我在 GUI 上的第 3 天。

import javax.swing.*;


public class HangmanPanel extends JPanel{
    private static final long serialVersionUID = -1767262708330188227L;{

    this.setLayout(null);
    JLabel heading = new JLabel("Welcome to the Hangman App");
    JButton Button = new JButton("Ok");
    //get input

    JLabel tfLable = new JLabel("Please Enter a Letter:");
    JTextField text = new JTextField(10);


    heading.setSize(200, 50);
    tfLable.setSize(150, 50);
    text.setSize(50, 30);
    Button.setSize(60, 20);


    heading.setLocation(300, 10);
    tfLable.setLocation(50, 40);
    text.setLocation(50, 80);
    Button.setLocation(100, 85);

    this.add(heading);
    this.add(tfLable);
    this.add(text);
    this.add(Button);
}}
4

5 回答 5

11

你的问题与serialVersionUID. 继续,删除整行;你会发现你仍然需要大括号。

您的问题是您在任何函数之外编写代码。因此,Java 认为它是一个实例初始化器,实例初始化器必须用大括号括起来。

最容易理解的解决方案是创建一个构造函数来包含您的代码:

public class HangmanPanel extends JPanel{
    private static final long serialVersionUID = -1767262708330188227L;

    public HangmanPanel () {

        this.setLayout(null);
        JLabel heading = new JLabel("Welcome to the Hangman App");
        JButton Button = new JButton("Ok");

        // and so on

从纯粹的行为角度来看,在这种情况下添加显式构造函数没有任何作用:实例初始化程序作为对象构造的一部分被调用。但是,它们令人困惑(正如您的问题所示)。添加构造函数消除了混乱。

于 2013-05-10T13:47:38.830 回答
2

您的语法错误是因为您直接在类文件中编写了代码。

将您的代码放在构造函数中:

public HangmanPanel() {
  // code here...
}

通过使用大括号,您无意中创建了一个初始化程序块。这些通常仅在为一个类创建多个构造函数并且有一段应该由所有构造函数执行的公共代码时使用。

于 2013-05-10T13:45:35.550 回答
0

报告的错误和解决方案有点误导:即第一行有正确的语法:

私有静态最终长序列版本UID = -1767262708330188227L;

下一个词是关键字'this',它必须写在实例方法的范围内。根据建议添加括号会创建一个匿名初始化程序,该初始化程序在语法上是正确的,但不是您想要做的。

正如 Duncan 所建议的 - 在实例方法/构造函数中编写实例初始化代码。

于 2013-05-10T13:57:47.770 回答
0

不,你被误导了。

内括号形成一个初始化块,类似于没有名称的构造函数。所有此类初始化程序块都在构造时调用。

public class A {

    public List<String> names; // Field
    { // Initializing block.
        Collections.addAll("John", "Elma");
    }

    // Constructor
    public A() {
    }

    public void f() { // Method
    }
}
于 2013-05-10T13:48:14.030 回答
0

序列化运行时与每个可序列化类关联一个版本号,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与序列化兼容的该对象的类。

您遇到了问题,因为您没有将代码放入函数/构造函数中。为了定义代码的范围,您添加了花括号。将代码放入函数中。

于 2013-05-10T13:48:42.903 回答