2016-05-24 9 views
0

これはかなり単純なJavaスコープの質問ですが、私はJavaを使い慣れていないし、これを理解するのに問題があります。具体的には、これはAndroidアプリケーション用ですが、私はこの質問のために重要であるとは確信していませんループ内のJava文字列配列のスコープ

私はSQLiteテーブルのデータを取り、それをCSVファイルに書き出す方法があります。メソッドに渡されるデータの種類に応じて、私は別のテーブルからデータを書き込みたい:

public void exportSubjectData(File outputFile, String subNum, String sensorType) throws IOException, SQLException { 

     csvWrite = new CSVWriter(new FileWriter(outputFile)); 

     switch (sensorType) { 
      case "acc": { 
       curCSV = db.rawQuery("SELECT * FROM " + DATA_ACC_TABLE_NAME + " WHERE id = " + subNum, null); 
       String arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2), 
         curCSV.getString(3), curCSV.getString(4)}; 
       break; 
      } 
      case "gyro": { 
       curCSV = db.rawQuery("SELECT * FROM " + DATA_GYRO_TABLE_NAME + " WHERE id = " + subNum, null); 
       String arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2)}; 
       break; 
      } 
     } 

     csvWrite.writeNext(curCSV.getColumnNames()); 

     while (curCSV.moveToNext()) { 
      csvWrite.writeNext(arrStr); 
     } 

     csvWrite.close(); 
     curCSV.close(); 
    } 

私の問題がで渡されるsensorTypeに応じて、私は1にしたいということである)異なるから選びますテーブルと2)異なる数の列を書き出します。私は宣言してarrStrブロックのswitchブロックにあるが、CSVに各列を書き込もうとすると、whileブロックにはarrStrへのアクセス権がない。おそらく、これはスコープの問題です。この問題を解決する正しい方法は何ですか?

私は私が予期しないトークンエラーを取得するスイッチのarrStr外を宣言しよう:

String[] arrStr; 

    switch (sensorType) { 
     case "acc": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_ACC_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2),curCSV.getString(3), curCSV.getString(4)}; 
      break; 
     } 
     case "gyro": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_GYRO_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2),curCSV.getString(3), curCSV.getString(4)}; 
      break; 
     } 
    } 

私は次のようなアプローチをも試してみましたが、アンドロイドスタジオはarrStrがintializedされていない可能性がどのように文句を言う:

String[] arrStr; 

    switch (sensorType) { 
     case "acc": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_ACC_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr = new String[]{curCSV.getString(0), curCSV.getString(1), curCSV.getString(2),curCSV.getString(3), curCSV.getString(4)}; 
      break; 
     } 
     case "gyro": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_GYRO_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr = new String[]{curCSV.getString(0), curCSV.getString(1), curCSV.getString(2),curCSV.getString(3), curCSV.getString(4)}; 
      break; 
     } 
    } 
+0

スイッチケースの上に文字列arrStr []を宣言します。あなたのコードでは、arrStrのスコープはcaseブロックでのみ制限されています。 –

+1

'String [] arrStr == null'修正が'初期化されていない可能性があります '警告 –

+0

' String [] arrStr = {}; 'より良いでしょう。また、@Vasilyは、 '=='ではなく、 '='だけをここに入れたいだけです。 –

答えて

0

は(switch外)このような配列変数を宣言してみてください:

public void exportSubjectData(File outputFile, String subNum, String sensorType) throws IOException, SQLException { 

    csvWrite = new CSVWriter(new FileWriter(outputFile)); 

    String arrStr[] = null; 

    switch (sensorType) { 
     case "acc": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_ACC_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr = new String[] {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2), 
        curCSV.getString(3), curCSV.getString(4)}; 
      break; 
     } 
     case "gyro": { 
      curCSV = db.rawQuery("SELECT * FROM " + DATA_GYRO_TABLE_NAME + " WHERE id = " + subNum, null); 
      arrStr = new String[] {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2)}; 
      break; 
     } 
    } 

    csvWrite.writeNext(curCSV.getColumnNames()); 

    while (curCSV.moveToNext()) { 
     csvWrite.writeNext(arrStr); 
    } 

    csvWrite.close(); 
    curCSV.close(); 
} 
+0

私はこれを含むいくつかのアプローチを試みましたが、根本的な問題である構文上の問題があると思います。私がこの解決策を試してみると、スイッチのケースで 'arrStr [] = ...'のまわりで予期せぬトークンについてアンドロイドスタジオが文句を言います – Simon

+0

私は答えを修正しました。 –