Java 我的能手和二传手都不是';不行吗?返回nullobjectreference?

Java 我的能手和二传手都不是';不行吗?返回nullobjectreference?,java,android,methods,static,getter-setter,Java,Android,Methods,Static,Getter Setter,这里是Java/Android开发的新手。最近,我在另一个类中使用静态变量访问来自主活动的用户输入。我被告知将其更改为getter/setter方法,因为在java中使用静态变量不是好代码(我听说了吗?)。因此,我创建了这些方法,并通过创建活动实例(本例中为MainActivity)在其他类中访问它们,然后使用构造函数调用该方法。无论如何,这是我的代码 public class MainActivity extends AppCompatActivity { //declare variable

这里是Java/Android开发的新手。最近,我在另一个类中使用静态变量访问来自主活动的用户输入。我被告知将其更改为getter/setter方法,因为在java中使用静态变量不是好代码(我听说了吗?)。因此,我创建了这些方法,并通过创建活动实例(本例中为MainActivity)在其他类中访问它们,然后使用构造函数调用该方法。无论如何,这是我的代码

public class MainActivity extends AppCompatActivity {
//declare variables
EditText name;
EditText data;
EditText wlan;
EditText utility;
Button addservice;
ListView lv;
ListView lv2;
ListView lv3;
ListView lv4;
public ArrayList<String> servicenames;
public ArrayList<String> dimensions;
public ArrayList<Double> costDATA;
public ArrayList<Double> costWLAN;
public ArrayList<Double> costUTILITY;
ArrayAdapter<String> namesAdapter;
ArrayAdapter<Double> dataAdapter;
ArrayAdapter<Double> wlanAdapter;
ArrayAdapter<Double> utilityAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //map the components to the variables
    name = (EditText) findViewById(R.id.servicename);
    data = (EditText) findViewById(R.id.data);
    wlan = (EditText) findViewById(R.id.wlan);
    utility = (EditText) findViewById(R.id.utility);
    addservice = (Button) findViewById(R.id.addservice);
    lv = (ListView) findViewById(R.id.lv);
    lv2 = (ListView) findViewById(R.id.lv2);
    lv3 = (ListView) findViewById(R.id.lv3);
    lv4 = (ListView) findViewById(R.id.lv4);

    //create arraylists for each component
    servicenames = new ArrayList<String>();
    dimensions = new ArrayList<String>();
    costDATA = new ArrayList<Double>();
    costWLAN = new ArrayList<Double>();
    costUTILITY = new ArrayList<Double>();

    //create adapters to pass on the arraylist
    namesAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, servicenames);
    dataAdapter = new ArrayAdapter<Double>(MainActivity.this, android.R.layout.simple_list_item_1, costDATA);
    wlanAdapter = new ArrayAdapter<Double>(MainActivity.this, android.R.layout.simple_list_item_1, costWLAN);
    utilityAdapter = new ArrayAdapter<Double>(MainActivity.this, android.R.layout.simple_list_item_1, costUTILITY);

    //display each arraylist in the listviews
    lv.setAdapter(namesAdapter);
    lv2.setAdapter(wlanAdapter);
    lv3.setAdapter(dataAdapter);
    lv4.setAdapter(utilityAdapter);
    namesAdapter.notifyDataSetChanged();
    dataAdapter.notifyDataSetChanged();
    wlanAdapter.notifyDataSetChanged();
    utilityAdapter.notifyDataSetChanged();
    dimensions.add("DATA");
    dimensions.add("WLAN");
    onClickBtn();
}

public void onClickBtn() { //when user clicks button, the user input is added to the listview, and cleared for the next service

    addservice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String namesOfService = name.getText().toString(); //user input for service names
            String costOfData = data.getText().toString(); //user input for data costs
            String costOfWLAN = wlan.getText().toString(); //user input for wlan costs
            String costOfUtility = utility.getText().toString(); //user input for utility costs
            Double doubleWLAN = Double.parseDouble(costOfWLAN); //convert user input into double
            Double doubleData = Double.parseDouble(costOfData);
            Double doubleUtility = Double.parseDouble(costOfUtility);
            costDATA.add(doubleData); //add the double costs to each resource arraylist
            costWLAN.add(doubleWLAN);
            costUTILITY.add(doubleUtility);
            servicenames.add(namesOfService);
            dimensions.add(namesOfService);
            int dimensionSize = dimensions.size();
            namesAdapter.notifyDataSetChanged();
            dataAdapter.notifyDataSetChanged();
            wlanAdapter.notifyDataSetChanged();
            utilityAdapter.notifyDataSetChanged();
            name.setText(""); //empty the edit text fields when button is clicked
            wlan.setText("");
            data.setText("");
            utility.setText("");

        }
    });
}

public void nextButton(View view) //next button, onto the next activity
{
    Intent intent = new Intent(MainActivity.this, ParticleActivity.class);
    startActivity(intent);
}

public int getDimensions(){

    return dimensions.size();

}

public ArrayList<String> getElements(){ return servicenames;}

public ArrayList<Double> getCostDATA(){;return costDATA;}

public ArrayList<Double> getCostWLAN(){return costUTILITY;}

public ArrayList<Double> getCostUTILITY(){return costUTILITY;}
}
public类MainActivity扩展了AppCompatActivity{
//声明变量
编辑文本名称;
编辑文本数据;
编辑文本无线局域网;
编辑文本实用程序;
按钮添加服务;
ListView lv;
ListView lv2;
ListView lv3;
ListView lv4;
公共ArrayList服务名称;
公共阵列列表维度;
公共ArrayList成本数据;
公共阵列列表;
公共ArrayList成本效用;
阵列适配器;
阵列适配器;
阵列适配器wlanAdapter;
阵列适配器实用适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将组件映射到变量
name=(EditText)findViewById(R.id.servicename);
数据=(EditText)findViewById(R.id.data);
wlan=(EditText)findviewbyd(R.id.wlan);
实用工具=(EditText)findViewById(R.id.utility);
addservice=(按钮)findViewById(R.id.addservice);
lv=(ListView)findViewById(R.id.lv);
lv2=(ListView)findViewById(R.id.lv2);
lv3=(ListView)findViewById(R.id.lv3);
lv4=(ListView)findViewById(R.id.lv4);
//为每个组件创建ArrayList
servicenames=newarraylist();
维度=新的ArrayList();
costDATA=新的ArrayList();
costWLAN=newarraylist();
costUTILITY=newarraylist();
//创建要在arraylist上传递的适配器
NameAdapter=new ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,servicenames);
dataAdapter=new ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,costDATA);
wlanAdapter=newarrayadapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,costWLAN);
utilityAdapter=new ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,costUTILITY);
//在列表视图中显示每个arraylist
lv.setAdapter(名称适配器);
lv2.设置适配器(wlanAdapter);
lv3.setAdapter(dataAdapter);
lv4.设置适配器(实用适配器);
namesAdapter.notifyDataSetChanged();
dataAdapter.notifyDataSetChanged();
wlanAdapter.notifyDataSetChanged();
utilityAdapter.notifyDataSetChanged();
尺寸。添加(“数据”);
尺寸。添加(“WLAN”);
onClickBtn();
}
public void onClickBtn(){//当用户单击按钮时,用户输入将添加到listview,并为下一个服务清除
addservice.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
String namesOfService=name.getText().toString();//服务名称的用户输入
String costOfData=data.getText().toString();//用户输入数据成本
String CostOfLAN=wlan.getText().toString();//用户输入的wlan成本
String costOfUtility=utility.getText().toString();//用户输入的公用事业成本
Double doubleWLAN=Double.parseDouble(costOfWLAN);//将用户输入转换为双精度
Double doubleData=Double.parseDouble(costOfData);
Double doubleUtility=Double.parseDouble(costOfUtility);
add(doubleData);//将双倍成本添加到每个资源arraylist
costWLAN.add(doubleWLAN);
添加(双重效用);
添加(服务名称);
维度。添加(服务名称);
int dimensionSize=dimensions.size();
namesAdapter.notifyDataSetChanged();
dataAdapter.notifyDataSetChanged();
wlanAdapter.notifyDataSetChanged();
utilityAdapter.notifyDataSetChanged();
name.setText(“”;//单击按钮时清空编辑文本字段
wlan.setText(“”);
data.setText(“”);
utility.setText(“”);
}
});
}
public void nextButton(查看)//下一个按钮,进入下一个活动
{
意向意向=新意向(MainActivity.this、ParticleActivity.class);
星触觉(意向);
}
公共int getDimensions(){
返回维度。size();
}
public ArrayList getElements(){return servicenames;}
公共ArrayList getCostDATA(){;返回costDATA;}
public ArrayList getCostWLAN(){return costUTILITY;}
public ArrayList getCostUTILITY(){return costUTILITY;}
}
我需要访问其他类中的ArrayList costData、costUtilities、costWlan和维度。这是我的另一节课

public class CustomUseCase extends Test {

MainActivity mainActivity = new MainActivity();
ParticleActivity particleActivity = new ParticleActivity();
public int numberOfDimensions = mainActivity.getDimensions();
private ArrayList<Double> costData = mainActivity.getCostDATA(); //costs that the user enters for each resource
private ArrayList<Double> costWlan = mainActivity.getCostWLAN();
private ArrayList<Double> costUtilities = mainActivity.getCostUTILITY();
private double batteryCost = particleActivity.getBatteryCost();
private int maxIter;
private int noParticles;
公共类CustomUseCase扩展测试{
MainActivity MainActivity=新的MainActivity();
ParticleActivity ParticleActivity=新ParticleActivity();
public int numberOfDimensions=mainActivity.getDimensions();
private ArrayList costData=mainActivity.getCostDATA();//用户为每个资源输入的成本
private ArrayList costWlan=mainActivity.getCostWLAN();
private ArrayList costUtilities=mainActivity.getCostUTILITY();
private double batteryCost=particleActivity.getBatteryCost();
私有int-maxIter;
私人物品;

我在这里做错了什么?解释一下我为什么做错了会是一个额外的收获!祝您好运。

您的MainActivity类没有构造函数。这意味着您的所有变量都已定义,但在调用

MainActivity mainActivity = new MainActivity();
new
关键字在这里很重要。请注意,这并不一定意味着你的应用程序无法工作,这取决于它的设置,但测试用例肯定不会

我认为在你的情况下,你需要补充:

public MainActivity(){
  onCreate(savedInstance); //Bundle savedInstance
}

@我不知道。但是在我的主要活动中