Android开发中逐次初始化Question对象数组报错,静态初始化正常?
问题分析与解决
你遇到的问题其实是Java语法规则导致的——在类的成员区域(也就是方法外面),只能进行变量的声明或者声明时直接初始化,不能单独写执行语句(比如ques[0] = new Question(...)这种赋值操作)。
为什么静态初始化方式没问题?
你用的静态初始化写法Question[] ques = new Question[]{...}是在声明变量的同时完成了所有元素的初始化,这属于变量声明的一部分,完全符合Java语法要求,所以编译器不会报错。
错误原因拆解
你写的这段代码:
Question[] ques = new Question[3]; ques[0] = new Question("What is your name?", 2, options1); ques[1] = new Question("Where are you from?", 3, options2); ques[2] = new Question("What do you do?", 4, options3);
第一行是变量声明,没问题,但后面三行是单独的赋值语句,直接放在类的成员区域(onCreate方法外面),这违反了Java的语法规则:类的顶层只能包含成员变量声明、方法、内部类、初始化块等,不能直接执行可执行语句。编译器会把这些语句当成方法声明的一部分来解析,自然会报一堆诸如"Identifier expected"、"Invalid method declaration"的错误。
正确的解决方法
把这些逐次初始化的代码移到方法内部(比如你的onCreate方法),或者使用实例初始化块,下面给你两种可行的写法:
方法1:移到onCreate方法中(推荐,符合Android Activity生命周期)
修改后的HomeActivity代码:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import static android.R.attr.x; public class HomeActivity extends AppCompatActivity { // 声明成员变量 String[] options1 = {"ABCD", "EFGH", "IJKL", "MNOP"}; String[] options2 = {"Bangalore", "Delhi", "Mumbai", "Pune"}; String[] options3 = {"Business", "Work", "Nothing", "Study"}; Question[] ques; // 只声明,不初始化 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); // 在方法内部完成数组初始化和元素赋值 ques = new Question[3]; ques[0] = new Question("What is your name?", 2, options1); ques[1] = new Question("Where are you from?", 3, options2); ques[2] = new Question("What do you do?", 4, options3); } }
方法2:使用实例初始化块
如果你希望在Activity实例创建时就完成初始化(不需要等到onCreate),可以用实例初始化块:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import static android.R.attr.x; public class HomeActivity extends AppCompatActivity { String[] options1 = {"ABCD", "EFGH", "IJKL", "MNOP"}; String[] options2 = {"Bangalore", "Delhi", "Mumbai", "Pune"}; String[] options3 = {"Business", "Work", "Nothing", "Study"}; Question[] ques; // 实例初始化块,在构造函数执行前运行 { ques = new Question[3]; ques[0] = new Question("What is your name?", 2, options1); ques[1] = new Question("Where are you from?", 3, options2); ques[2] = new Question("What do you do?", 4, options3); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); } }
补充说明
作为Android新手,记住Activity的生命周期——onCreate是Activity创建时第一个执行的回调方法,大部分初始化操作放在这里是最稳妥的,也符合Android的最佳实践。
内容的提问来源于stack exchange,提问作者apps
相关产品推荐
相关产品推荐

