主类之外的Java ArrayList语法错误

时间:2019-06-19 23:45:33

标签: java syntax-error

我正在尝试制作一个简单的子手游戏。我需要帮助的方面是宣布hangman阶段,这是一个arraylist。将此列表移出我的主类之外后,我收到了一些以前未报告的语法错误警告。

我可以将其移回主类,但这对我来说就意味着在一个地方放置太多代码。我也想深入了解这个问题。

public static void main(String[] args) {

// omitted game setup code, ArrayList has been imported

}

public class hangMen{

    // here is where the error occurs
            // all of the lines below show a syntax error
            // All the lines have Syntax error on token ";" & ".", @ expected


    List<String> stage = new ArrayList<String>();
    stage.add("-------");
    stage.add("|     |");
    stage.add("|");
    stage.add("|");
    stage.add("|");
    stage.add("|");
    stage.add("|___________");}

//最后一行有语法错误,插入“)”以完成方法声明,插入标识符以完成MethodHeaderName,插入“ SimpleName”以完成限定名称

我以前从未见过这种情况,我的老师也很困惑。有帮助吗?

2 个答案:

答案 0 :(得分:1)

您的代码必须位于一个块内。它不能直接在类中。

假设这是初始化,则可以将add放在初始化程序块中:

List<String> stage = new ArrayList<String>();

{  // Add
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
} // Add

,但是使用初始化程序块是非常不寻常的。将初始化放入构造函数中等效于使用初始化器,但这是执行“复杂”初始化的更常见的地方:

List<String> stage = new ArrayList<String>();

hangMen() {
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
}

或者,您可以声明一个方法:

List<String> stage = buildStage();

List<String> buildStage() {
  List<String> stage = new ArrayList<>();
  stage.add("-------");
  stage.add("|     |");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|");
  stage.add("|___________");
}

但是我只想使用Arrays.asList内联声明列表:

List<String> stage = new ArrayList<>(Arrays.asList(
    "-------",
    "|     |",
    "|",
    "|",
    "|",
    "|",
    "|___________"));

答案 1 :(得分:1)

构造函数

Image of cookie-cutter

类是在编译时定义的模板,可在运行时用于实例化对象。就像切饼机一样,它是冲压出一系列Cookie的模板。

每次您的应用制作另一个对象(在这种情况下为另一个HangMen游戏)时,您可能需要进行一些设置工作才能使该对象准备就绪。这项工作通常以constructor方法完成。构造函数是一种特殊的方法,其名称与类名完全相同。构造函数的特殊之处还在于,它没有指定返回值。其他所有方法都必须指定返回类型或指定void,而构造函数则不指定。 Java平台保证构造函数一直运行到对象完全投入使用之前。

您可以在切出cookie并装饰cookie的那一刻将其视为构造函数。只有完成装饰后,您才能将Cookie放在可以食用的盘子上,就像准备将其投入使用一样。

提示:我发现用注释行标记我的构造方法很有帮助。读取代码时使其更易于扫描。

这种创建,准备,投入使用并最终在运行时停止大量软件的过程称为 lifecycle ,它是在编程中应学习的关键概念之一。

要保留字符串列表以备初始构造后使用,请在课程上define the variable as a member field

而且,在现代Java中,您无需在< String >上重复ArrayList,因为编译器可以弄清楚这一点。

确保学习并遵循Java命名约定。类名应以大写字母开头。所以HangMen,而不是hangMen。相反,持有对对象(实例)的引用的变量以小写字母开头。

public class HangMen{

    // ----|  Members  |------------------------
    private List< String > stage ;

    // ----|  Constructor  |------------------------
    public HangMen() {

        this.stage = new ArrayList<>() ;
        stage.add("-------");
        stage.add("|     |");
        stage.add("|");
        stage.add("|");
        stage.add("|");
        stage.add("|");
        stage.add("|___________");}

    }

    public void report() {
        System.out.println( "stage: " ) ;
        System.out.println( this.stage.toString() ) ;
    }

}

让我们通过main方法尝试该类。

HangMen hangMen = new HangMen() ;  // Invokes your constructor implicitly. At runtime, the class `HangMen` (note the uppercase `H`) is used to create a new instance (new object). A reference to the object is assigned to the variable named `hangMen` (note the lowercase `h`).
hangMen.report() ;                 // Invokes the `report` method for this instance (this object). 

请注意,this.stagestage的使用关系。 this.明确表示您的意思是成员变量,而不是局部变量。当您引用成员变量与局部变量时,编译器通常可以自行检测。在以前的几年中,我更喜欢使用this.来使代码阅读更加清晰。但是现在IDE带有其着色功能,提供了关于哪些变量是成员变量还是局部变量的直观线索。因此,您可能要省略this.前缀。我以这两个为例。

提示:为清楚起见,请勿在{{1​​}}类中放置main方法。将其放在自己的HangMen文件中的另一个类中,该类名为App.java方法本质上是一种必不可少的弊端,它只是一种非面向对象的技巧,目的是要从冷酷的硬件,操作系统和命令行控制台世界中启动我们的面向对象的天堂。单独使用main方法(基本上忽略它们)可以帮助学习Java。

main