简体   繁体   English

Java:如何在另一个类中传递和使用此数组

[英]Java: how to pass and use this array in another class

I've got a CSV reader class and I've got a user creator class. 我有一个CSV阅读器类,还有一个用户创建者类。 I want the user creator class to take the array, generated by the CSV reader and assign the data to some variables, but Im getting a nullpointerexception 我希望用户创建者类采用由CSV阅读器生成的数组,并将数据分配给某些变量,但是我得到了nullpointerexception

Here is the CSV reader class: 这是CSV阅读器类:

public class CSVData {

    private static final String FILE_PATH="C:\\250.csv";

    @Test
    public static void main() throws Exception {

        CSVReader reader = new CSVReader(new FileReader(FILE_PATH));
        ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
        String[] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            ArrayList<String> list = new ArrayList<String>();
            for (int i=0;i<5;i++) { //5 is the number of sheets
               list.add(nextLine[i]);
            }
            array.add(list);

        }

        /*for(int x=0;x<array.size();x++) {
            for(int y=0;y<array.get(x).size();y++) {          
            }
        }*/
        AppTest3 instance = new AppTest3();
        instance.settingVariables(array);
        reader.close();
        }
    }

And here is the user creator class 这是用户创建者类

public class AppTest3 extends AppData (which extends CSVData) {

    private String[] firstname;
    private String[] lastname;

    public void settingVariables(ArrayList<ArrayList<String>> array) {
        int randomUser1 = randomizer (1, 250);
        int randomUser2 = randomizer (1, 250);
        String firstname1 = array.get(randomUser1).get(0);
        String firstname2 = array.get(randomUser2).get(0);
        String lastname1 = array.get(randomUser1).get(1);
        String lastname2 = array.get(randomUser2).get(1) ;
        //firstname = { firstname1, firstname2 }; //this doesnt work, dunno why
        //lastname = { lastname1, lastname2 };
        firstname[0] = firstname1.replace(" ", "");
        firstname[1] = firstname2.replace(" ", "");
        lastname[0] = lastname1.replace(" ", "");
        lastname[1] = lastname2.replace(" ", "");
    }
@Parameters({ "driver", "wait" })
@Test(dataProvider = "dataProvider")
public void oneUserTwoUser(WebDriver driver, WebDriverWait wait)
        throws Exception {
        // A user signs up, then signs out, then a second user signs up
        for (int y = 0; y < 2; y++) {
            String email = firstname[y].toLowerCase() + randomNumber + "@"
                    + lastname[y].toLowerCase() + emailSuffix;
    //test here
    }
}

This is the error message 这是错误消息

FAILED: oneUserTwoUser(org.openqa.selenium.support.events.EventFiringWebDriver@5efed246, org.openqa.selenium.support.ui.WebDriverWait@2b9f2263)
java.lang.NullPointerException
    at com.pragmaticqa.tests.AppTest3.oneUserTwoUser(AppTest3.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

PS: System.out.println(firstname[0]); PS:System.out.println(firstname [0]); doesnt display anything in the console. 在控制台中不显示任何内容。 System.out.println(array); System.out.println(array); displays the list of arrays. 显示数组列表。

EDIT: I found out what the problem was: first of all I changed the way I initialize string[] to this 编辑:我发现了问题所在:首先,我更改了将string []初始化的方式

String[] firstname = new String[2];
String[] lastname = new String[2];

Now firstname[0] returns a value. 现在,firstname [0]返回一个值。

However, when I try to system.out.println firstname[0] in the next method that actually contains the test case, it returns null. 但是,当我尝试在实际包含测试用例的下一个方法中使用system.out.println firstname [0]时,它将返回null。

So I have to find a way to pass those strings to that method. 因此,我必须找到一种将这些字符串传递给该方法的方法。

In you main method instance is just a local variable that is lost after method execution ends.: 在您的main方法instance中,只是一个局部变量,该局部变量在方法执行结束后会丢失:

 AppTest3 instance = new AppTest3();  // just local variable that is lost after method execution ends.
 instance.settingVariables(array);

Thus, oneUserTwoUser is invoked on another instance that has no parameters set. 因此,在没有设置参数的另一个实例上调用oneUserTwoUser You can see this with debugger. 您可以使用调试器看到这一点。

You can put initialization to method before as below into Apptest3 class: 你可以把初始化方法before ,如下为Apptest3类:

public class AppTest3 {

  AppTest3 instance; // field used by tests

  @BeforeSuite(alwaysRun = true) 
  public void before() throws Exception {

    CSVReader reader = new CSVReader(new FileReader(FILE_PATH));
    ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
    String[] nextLine;
    while ((nextLine = reader.readNext()) != null) {
        ArrayList<String> list = new ArrayList<String>();
        for (int i=0;i<5;i++) { //5 is the number of sheets
           list.add(nextLine[i]);
        }
        array.add(list);

    }

    instance = new AppTest3();  /// init your instance here
    instance.settingVariables(array);
    reader.close();
    }
  }

I've found a solution to this problem by heavily refactoring the code. 我已经通过大量重构代码找到了解决该问题的方法。 Its all explained here 这一切都在这里解释

Java: how can I put two String[] objects into one object and pass them to the next method? Java:如何将两个String []对象放入一个对象并将它们传递给下一个方法?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM