2014-08-31 3 views
0

Я пытаюсь разобрать файл csv на сервере, используя AsyncTask. Это мой код:Android NullPointerException lock == null

 @Override 
     protected String doInBackground(String... params) { 

      InputStream inStream = null; 


      URL stockURL = null; 
      try { 
       stockURL = new URL("http://antoniofalcone.it/fantavoti/gazz.csv"); 
      } catch (MalformedURLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      BufferedReader input = null; 
      try { 
       input = new BufferedReader(new InputStreamReader(stockURL.openStream())); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      }   
      String line = ""; 

        try { 
         while ((line = input.readLine()) != null) { 
         String[] colums = line.split(","); 
          if (colums.length > 13) { 
           Log.d("CSVParser", "Skipping Bad CSV Row"); 
           continue; 
          } 

         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 



    return "All Done!"; 
} 

Я получаю NullPointerException: lock == null. Как я могу это исправить? Это полный LogCat:

08-31 21:42:28.918: E/OpenGLRenderer(2774): Getting MAX_TEXTURE_SIZE from GradienCache 
08-31 21:42:28.918: E/AndroidRuntime(2774): FATAL EXCEPTION: AsyncTask #1 
08-31 21:42:28.918: E/AndroidRuntime(2774): Process: com.example.task, PID: 2774 
08-31 21:42:28.918: E/AndroidRuntime(2774): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.lang.Thread.run(Thread.java:841) 
08-31 21:42:28.918: E/AndroidRuntime(2774): Caused by: java.lang.NullPointerException: lock == null 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.io.Reader.<init>(Reader.java:64) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.io.InputStreamReader.<init>(InputStreamReader.java:122) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.io.InputStreamReader.<init>(InputStreamReader.java:59) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at com.example.task.MainActivity$PostTask.doInBackground(MainActivity.java:85) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at com.example.task.MainActivity$PostTask.doInBackground(MainActivity.java:1) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-31 21:42:28.918: E/AndroidRuntime(2774):  ... 4 more 
08-31 21:42:28.922: E/OpenGLRenderer(2774): MAX_TEXTURE_SIZE: 16384 
08-31 21:42:28.926: E/OpenGLRenderer(2774): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
08-31 21:42:28.934: E/OpenGLRenderer(2774): MAX_TEXTURE_SIZE: 16384 
+1

Это не значит, что вы уже задали [близкий идентичный вопрос] (http://stackoverflow.com/questions/25594817/nullpointer-asynctask-return) один раз сегодня на другом посту, который меня беспокоит. Это факт, что код, который вы публикуете, по-прежнему будет иметь ** SAME BUGS **, как указано в ответах в вашем предыдущем вопросе. Ваш код продолжает проглатывать исключения с помощью блока try/catch, а затем ** ПРОДОЛЖАЕТСЯ ** без возврата - как будто никогда не было ошибки. И вы удивляетесь, почему ваша программа рушится! – selbie

+0

И что еще? Что я могу сделать, чтобы исправить мой код? @selbie – slash89mf

ответ

0

Как я уже указывал вам в других ответах и ​​комментариях - Ловля исключения, а затем продолжающее абсолютно неправильно и является наиболее вероятной причиной вашей аварии.

С учетом этого это лучший способ открыть поток URL и проанализировать содержимое.

И пока мы на нем, давайте разберем загрузку контента отдельно от разбора содержимого. Это облегчает отладку и легче тестировать. Для этого давайте определим небольшую вспомогательную функцию, one I've used in my own code, чтобы загрузить файл в строку по http.

public class ContentDownloader 
{ 
    public static String downloadString(String urlstring) throws IOException 
    { 
     URL url = new URL(urlstring); 
     HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 

     connection.setReadTimeout(30000); 
     connection.setConnectTimeout(30000); 

     connection.connect(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     StringBuilder sb = new StringBuilder(); 
     char [] buffer = new char[5000]; 

     while (true) 
     { 
      int result = reader.read(buffer); 
      if (result < 0) 
      { 
       break; 
      } 

      sb.append(buffer, 0, result); 
     } 

     String response = sb.toString(); 
     return response; 
    } 
} 

Теперь давайте определим немного синтаксический анализ помощника, который может конвертировать загруженную строку на несколько строк и расщепляет каждую строку CSV на столбцы. Вы можете изменить это по мере необходимости

public class CSVParser 
{ 
    public static ArrayList<String[]> parse(String str) 
    { 
     ArrayList<String[]> parsed_lines = new ArrayList<String[]>(); 

     String lines [] = str.split("\\r?\\n"); 
     for (String row : lines) 
     { 
      row = row.trim(); 
      if (row.length == 0) 
      { 
       continue; 
      } 
      String [] columns = row.split(","); 
      for (int x = 0; x < columns.length; x++) 
      { 
       columns[x] = columns[x].trim(); 
      } 
      parsed_lines.add(columns); 
     } 
     return parsed_lines; 
    } 
} 

И теперь, ваш AsyncTask это просто так:

protected String doInBackground(String... params) { 

    String content = null; 
    ArrayList<String[]> parsed_lines = null; 

    try { 
     content = ContentDownloader.downloadString(); 
     parsed_lines = CSVParser.parse(content); 
    } 
    catch(IOException ioex) { 
     Log.d(TAG, "IOException", ioex); 
     return; // DO NOT CONTINUE IF WE FAILED TO DOWNLOAD 
    } 

    // if we get to this point here, parsed_lines 
    // will be a parsed CSV file 
} 

Вы можете.

Смежные вопросы