Java Android NullPointerException锁==null

Java Android NullPointerException锁==null,java,android,csv,nullpointerexception,Java,Android,Csv,Nullpointerexception,我正在尝试使用AsyncTask解析服务器上的csv文件。这是我的代码: @Override protected String doInBackground(String... params) { InputStream inStream = null; URL stockURL = null; try { stockURL = new URL("http

我正在尝试使用
AsyncTask
解析服务器上的csv文件。这是我的代码:

        @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。我怎样才能解决这个问题?这是完整的日志:

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
08-31 21:42:28.918:E/OpenGLRenderer(2774):从GradieCache获取最大纹理大小
08-31 21:42:28.918:E/AndroidRuntime(2774):致命异常:AsyncTask#1
08-31 21:42:28.918:E/AndroidRuntime(2774):进程:com.example.task,PID:2774
08-31 21:42:28.918:E/AndroidRuntime(2774):java.lang.RuntimeException:执行doInBackground()时出错
08-31 21:42:28.918:E/AndroidRuntime(2774):在android.os.AsyncTask$3.done(AsyncTask.java:300)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-31 21:42:28.918:E/AndroidRuntime(2774):位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-31 21:42:28.918:E/AndroidRuntime(2774):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-31 21:42:28.918:E/AndroidRuntime(2774):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-31 21:42:28.918:E/AndroidRuntime(2774):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.lang.Thread.run(Thread.java:841)处
08-31 21:42:28.918:E/AndroidRuntime(2774):由以下原因引起:java.lang.NullPointerException:lock==null
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.io.Reader上(Reader.java:64)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.io.InputStreamReader上。(InputStreamReader.java:122)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.io.InputStreamReader上。(InputStreamReader.java:59)
08-31 21:42:28.918:E/AndroidRuntime(2774):位于com.example.task.MainActivity$PostTask.doInBackground(MainActivity.java:85)
08-31 21:42:28.918:E/AndroidRuntime(2774):位于com.example.task.MainActivity$PostTask.doInBackground(MainActivity.java:1)
08-31 21:42:28.918:E/AndroidRuntime(2774):在android.os.AsyncTask$2.call(AsyncTask.java:288)
08-31 21:42:28.918:E/AndroidRuntime(2774):在java.util.concurrent.FutureTask.run(FutureTask.java:237)
2008-31 21:42:28.918:E/AndroidRuntime(2774):。。。4更多
08-31 21:42:28.922:E/OpenGLRenderer(2774):最大纹理大小:16384
08-31 21:42:28.926:E/OpenGLRenderer(2774):从缓存获取最大纹理大小::initConstraints()
08-31 21:42:28.934:E/OpenGLRenderer(2774):最大纹理大小:16384

正如我在其他答案和评论中向您指出的那样,捕获异常然后继续是绝对错误的,这是导致崩溃的最可能原因

话虽如此,这是打开URL流并解析内容的更好方法

当我们开始时,让我们将内容的下载与内容的解析分开。这使得调试和测试更容易。为此,让我们定义一个小助手函数,通过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;
    }
}
公共类内容下载程序
{
公共静态字符串downloadString(字符串urlstring)引发IOException
{
URL=新URL(URL字符串);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setReadTimeout(30000);
连接。设置连接超时(30000);
connection.connect();
BufferedReader=new BufferedReader(new InputStreamReader(connection.getInputStream());
StringBuilder sb=新的StringBuilder();
char[]buffer=新字符[5000];
while(true)
{
int result=reader.read(缓冲区);
如果(结果<0)
{
打破
}
sb.追加(缓冲区,0,结果);
}
字符串响应=sb.toString();
返回响应;
}
}
现在,让我们定义一个小的解析助手,它可以将下载的字符串转换为多行,并将每个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;
    }
}
公共类CSVParser
{
公共静态ArrayList解析(字符串str)
{
ArrayList parsed_lines=新的ArrayList();
字符串行[]=str.split(\\r?\\n”);
用于(字符串行:行)
{
row=row.trim();
if(row.length==0)
{
持续
}
String[]columns=row.split(“,”);
对于(int x=0;x
现在,您的任务就是:

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
}
受保护的字符串doInBackground(字符串…参数){
字符串内容=null;
ArrayList解析的_行=null;
试一试{
content=ContentDownloader.downloadString();
parsed_lines=CSVParser.parse(内容);
}
捕获(IOException ioex){
Log.d(标签“IOException”,ioex);
return;//如果下载失败,请不要继续
}
//如果我们到了这一点,解析的_行
//将是一个已解析的CSV文件
}

不客气。

我不是因为你今天在另一篇帖子上问了一次问题而感到困扰。事实上,您发布的代码仍然存在与您在上一个问题中的答案所指出的相同的错误。您的代码继续使用try/catch块吞咽异常,然后继续执行而不返回,就好像从来没有发生过错误一样。你想知道为什么你的程序会崩溃!那又怎样?我能做些什么来修复我的代码@塞尔比