2013-05-10 51 views
0

我有一个与serialVersionUID一行的语法错误。要解决这个错误,我必须在该行的末尾放置一个括号,并在我的代码结束时关闭它......我的问题是为什么?在包含Jframe的文件中没有必要这么做......还有什么是serialVersionUID?如果我的问题看起来很简单,我很抱歉,我对编程很陌生,对于Java更新,这是我在GUI上的第三天。为什么我的serialVersionUID后需要一个大括号?

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); 
}} 
+0

序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,它在反序列化过程中用于验证序列化对象的发送者和接收者是否已加载该对象的与序列化相容的类。同时把你的代码放在函数中,而不是直接放在类下 – 2013-05-10 13:44:53

+2

这不是重复的http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it – 2013-05-10 14:24:20

+1

@ AndyThomas克拉默我同意(我投票关闭作为“太本地化”)。如果重新打开,我会再次投票。 – 2013-05-10 14:39:25

回答

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 

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

+0

@DuncanJones - 你是对的,我编辑过。 – parsifal 2013-05-10 13:57:14

+0

谢谢......我觉得很愚蠢,但是谢谢......如果我犯这样的错误,我认为是时候离开我的程序了... – Sage1216 2013-05-10 14:08:20

2

您的语法错误是由于您直接在类文件中编写代码而引起的。

将您的代码在构造函数来代替:

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

通过使用大括号,你在不经意间创造了一个initializer block。这些通常只在为类创建多个构造函数时使用,并且具有应由所有构造函数执行的一段通用代码。

0

不,你被误导了。

内部括号形成一个初始化块,就像一个没有名字的构造函数。 所有这样的初始化块在构造时被调用。

public class A { 

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

    // Constructor 
    public A() { 
    } 

    public void f() { // Method 
    } 
} 
0

序列化运行时相关联,每个序列化类版本号,称为的serialVersionUID,其被反序列化过程用于验证序列化对象的发送者和接收者都加载的类该对象是相对于兼容序列化。

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

0

误差和溶液报道有些误导:即第一线具有正确的语法:

私有静态最后长的serialVersionUID = -1767262708330188227L;

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

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

相关问题