我的serialVersionUID之后为什么需要大括号?

时间:2013-05-10 13:41:31

标签: java user-interface serialversionuid

我有一个语法错误,一行是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);
}}

5 个答案:

答案 0 :(得分: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

从纯粹的行为角度来看,在这种情况下添加显式构造函数 什么都不做:实例初始化器作为对象构造的一部分被调用。但是,它们令人困惑(正如您在问题中所表明的那样)。添加构造函数可以消除混淆。

答案 1 :(得分:2)

导致语法错误,因为您已直接在类文件中编写代码。

将代码放在构造函数中:

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

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

答案 2 :(得分:0)

不,你被误导了。

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

public class A {

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

    // Constructor
    public A() {
    }

    public void f() { // Method
    }
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

private static final long serialVersionUID = -1767262708330188227L;

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

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