为什么eclipse会在这里产生语法错误?

时间:2013-09-16 19:57:32

标签: java syntax

我的代码:

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;

public class TAFrame {

    private JFrame mainFrame;
    private JPanel mainPanel;
    private JButton button;
    private JTextArea textArea; //eclipse say Syntax error } expected


    mainFrame = new JFrame("mainFrame");
    mainPanel = new JPanel();
    button = new JButton("click me");
    area = new JTextArea(10, 15); 


}

无法找到解决方案,但我认为这很容易让人感到尴尬:/

4 个答案:

答案 0 :(得分:5)

我相信你想把一些代码放在构造函数中,如下所示:

public class TAFrame {

    private JFrame mainFrame;
    private JPanel mainPanel;
    private JButton button;
    private JTextArea textArea;

    public TAFrame() {
       mainFrame = new JFrame("mainFrame");
       mainPanel = new JPanel();
       button = new JButton("click me");
       area = new JTextArea(10, 15); 
    }
}

问题是你试图在任何方法之外执行任意代码。声明字段后,您需要通过方法访问它。只能在同一行上初始化它,因此您可以执行以下操作:

public class TAFrame {

    private JFrame mainFrame = new JFrame("mainFrame");
    private JPanel mainPanel = new JPanel();
    private JButton button = new JButton("click me");
    private JTextArea textArea = new JTextArea(10, 15); 
}

在这种情况下,我建议使用构造函数方法,但无论如何,您最需要一个构造函数,因为您可能想要向该按钮添加一个actionlistener(例如)。

答案 1 :(得分:3)

这里的大多数答案都正确地指出您可以使用初始值进行初始化,并且可以使用构造函数。但是,Java教程Initializing Fields实际上描述了两个非构造函数初始化字段的方法:(i)初始值; (ii)初始化块。

以下代码演示了所有三种方法(并显示了实例和静态初始化块):

public class InitializationExample {
    private int field1 = 1; // in-line initializer
    private int field2a;
    private static int field2b;
    private int field3;

    { 
        field2a = 3; // instance initializer
    }

    static {
        field2b = 3; // static initializer
    }

    public InitializationExample( final int field3 ) {
        this.field3 = field3;
    }
}

使用初始化块,您可以对代码进行非常小的更改并进行编译:

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;

public class TAFrame {
    private JFrame mainFrame;
    private JPanel mainPanel;
    private JButton button;
    private JTextArea textArea;

    {    
      mainFrame = new JFrame("mainFrame");
      mainPanel = new JPanel();
      button = new JButton("click me");
      area = new JTextArea(10, 15); 
    }
}

即使这是可能的,但它并不是非常常见,所以除非你有一些特别好的理由使用它,或者它已经在你正在使用的代码库中很常见,初始值或构造函数可能更多可读和可维护的选项。同样重要的是要注意,根据Java语言规范中的12.5. Creation of New Class Instances,实例初始化代码(和初始值)在构造函数代码运行之前被处理。

与基于构造函数的方法相比,初始化块方法有一个可能的好处。如果你确实把它变成了构造函数,那就是

    public TAFrame() {    
      mainFrame = new JFrame("mainFrame");
      mainPanel = new JPanel();
      button = new JButton("click me");
      area = new JTextArea(10, 15); 
    }

然后引入另一个构造函数以后需要一些参数,你需要从该构造函数显式调用零参数构造函数(构造函数链接),或者在该构造函数中包含初始化赋值,太。使用初始化块,您不需要这样做。

当您创建匿名子类的实例时,初始化块也很方便,因为您可以将初始化代码视觉保持在类“内部”。您可以阅读double brace initialization了解更多详情,但这是一个简单的例子:

import java.util.HashMap;
import java.util.Map;

public class MapInitializationExample {
    public static void main(String[] args) {
        // initialization code for this Map is visually "inside" the map
        final Map<Integer,String> numberNames = new HashMap<Integer,String>() {{
            put(1,"one");
            put(2,"two");
            put(3,"three");
        }};
    }
}

答案 2 :(得分:1)

因为您将代码置于不属于的方法之外。

特别是这个块:

mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15); 

错误有点欺骗,因为看起来private JTextArea textArea;需要一个右大括号。但实际上,问题是下一个行不属于那里。下一行mainFrame = new JFrame("mainFrame");表示方法已经开始,前一个块从未关闭,因此引用了一个缺失的}。

您有两种选择:

  1. 实例化与其声明一致的对象
  2. 在构造函数中实例化对象
  3. 实例化内嵌

    import java.awt.Dimension;
    import java.awt.Toolkit;
    import javax.swing.*;
    
    public class TAFrame {
        private JFrame mainFrame = new JFrame("mainFrame");
        private JPanel mainPanel = new JPanel();
        private JButton button = new JButton("click me");
        private JTextArea textArea = new JTextArea(10, 15);
    }
    

    使用构造函数实例化

    import java.awt.Dimension;
    import java.awt.Toolkit;
    import javax.swing.*;
    
    public class TAFrame {
        private JFrame mainFrame;
        private JPanel mainPanel;
        private JButton button;
        private JTextArea textArea;
    
        public TAFrame() {
            mainFrame = new JFrame("mainFrame");
            mainPanel = new JPanel();
            button = new JButton("click me");
            area = new JTextArea(10, 15); 
        }
    }
    

    我个人更喜欢内联方法,因为它不那么详细。

答案 3 :(得分:0)

你应该这样做。

 public class TAFrame {

  private JFrame mainFrame;
  private JPanel mainPanel;
  private JButton button;
  private JTextArea textArea;

  public void initComponents() {
    mainFrame = new JFrame("mainFrame");
    mainPanel = new JPanel();
    button = new JButton("click me");
    area = new JTextArea(10, 15); 
 }
}

或者您可以在那里创建和实例化控件。

 private JFrame mainFrame = new JFrame("mainFrame");
 private JPanel mainPanel = new JPanel();
 private JButton button = new JButton("click me");
 private JTextArea textArea = new JTextArea(10, 15);