2013-05-10 54 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所建議的 - 在實例方法/構造函數中編寫實例初始化代碼。

相關問題