0

CSV リーダー クラスとユーザー クリエーター クラスがあります。ユーザー クリエーター クラスに、CSV リーダーによって生成された配列を取得し、そのデータをいくつかの変数に割り当ててもらいたいのですが、nullpointerexception が発生します

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();
        }
    }

そして、ここにユーザークリエータークラスがあります

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
    }
}

これはエラーメッセージです

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]); コンソールには何も表示されません。System.out.println(配列); アレイのリストを表示します。

編集:問題が何であるかを見つけました:まず、string[] を初期化する方法をこれに変更しました

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

firstname[0] が値を返すようになりました。

ただし、実際にテスト ケースを含む次のメソッドで system.out.println firstname[0] を実行しようとすると、null が返されます。

そのため、これらの文字列をそのメソッドに渡す方法を見つける必要があります。

4

2 に答える 2

1

あなたのmainメソッドinstanceは、メソッドの実行が終了した後に失われる単なるローカル変数です。

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

したがって、oneUserTwoUserパラメータが設定されていない別のインスタンスで呼び出されます。これはデバッガで見ることができます。

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();
    }
  }
于 2013-08-09T08:57:55.053 に答える
0

コードを大幅にリファクタリングすることで、この問題の解決策を見つけました。そのすべてがここで説明されています

Java: 2 つの String[] オブジェクトを 1 つのオブジェクトに入れて、次のメソッドに渡すにはどうすればよいですか?

于 2013-08-09T13:01:30.067 に答える