Java 导致线程终止的线程代码中的NullPointerException

Java 导致线程终止的线程代码中的NullPointerException,java,android,multithreading,nullpointerexception,handler,Java,Android,Multithreading,Nullpointerexception,Handler,我的Asynctask中有以下代码: public DialogoAlerta dialogo; public FileOutputStream fos; public int size; public byte[] buf; public int byteRead; public int bytesDownloaded; public InputStream inputStream; public int time; public

我的Asynctask中有以下代码:

public DialogoAlerta dialogo;
    public FileOutputStream fos;
    public int size;
    public byte[] buf;
    public int byteRead;
    public int bytesDownloaded;
    public InputStream inputStream;
    public int time;
    public Thread hilo;

    @Override
    protected Boolean doInBackground(Void... arg0) {

        readXML();

        db = bdhelper.getWritableDatabase();

        if(db != null)
        {
            Log.d("Tamaño de la lista", buttonsList.size()+"");

for(int i=0; i<buttonsList.size(); i++)
            {
                String[] campos = new String[] {"local"};
                String[] args = new String[] {buttonsList.get(i).getImageurl().toString()};
                Cursor c = db.query("Imagenes", campos, "url=?", args, null, null, null);
                Cursor c2 = db.rawQuery("SELECT url, local FROM Imagenes WHERE url='"+args+"' AND local='imagemissing.png'", null);
                Log.d("El valor de la consulta es: ", "valor "+c.moveToFirst());
                if (!c.moveToFirst() || (c.moveToFirst() && c2.moveToFirst())){
                    if(isOnline()){
                    //Generamos los datos
                        Random generator = new Random();
                        int n = 10000;
                        n = generator.nextInt(n);

                        String url = buttonsList.get(i).getImageurl().toString();
                        String local = "Imagen" + n;
                        try {
                            URL direccion = new URL(url);
                            File myDir =  new File(Environment.getExternalStorageDirectory () +"/Aspaceimages/");

                            if(!myDir.exists()){
                                myDir.mkdirs();
                                Log.v("", "Se crea la ruta "+myDir);
                            }

                            File file = new File (myDir, local+".jpg");
                            while(file.exists()){
                                local = local + n;
                                file = new File(myDir, local+".jpg");
                            }

                            URLConnection ucon = direccion.openConnection();
                            inputStream = null;
                            HttpURLConnection httpConn = (HttpURLConnection)ucon;
                            httpConn.setRequestMethod("GET");
                            httpConn.connect();
                            Log.d("Peso de la imagen en Bytes (header): ", httpConn.getContentLength()+"");


                          if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                           inputStream = httpConn.getInputStream();
                          }

                            fos = new FileOutputStream(file);
                            size = 1024*1024;
                            buf = new byte[size];
                            bytesDownloaded = 0;

                            hilo = new Thread(new Runnable() {

                                @Override
                                public void run() {
                                    // TODO Auto-generated method stub
                                    try {
                                        Log.i("ID DEL HILO", hilo.getId()+"****************************");
                                        while (((byteRead = inputStream.read(buf)) != -1)) {
                                            fos.write(buf, 0, byteRead);
                                            bytesDownloaded += byteRead;
                                            Log.d("leyendo imagen", "descargando imagen del servidor");
                                        }
                                        Log.d("peso de la imagen descargada", ""+bytesDownloaded);
                                        fos.close();
                                        Message msg = new Message();
                                          msg.what = IMAGE_DOWNLOADED;
                                          mHandler.sendMessage(msg);
                                    } catch (IOException e) {
                                        Log.e("Error", "not downloading");
                                        e.printStackTrace();
                                    }

                                }
                            });
                            hilo.start();   



                            //Compruebo si hay conexión accediendo al tipo de contenido
                                if(!httpConn.getContentType().toString().contains("image")){
                                    db.execSQL("DROP TABLE Imagenes");
                                    Log.d("Eliminada: ", "Base de datos eliminada");
                                    db.execSQL("CREATE TABLE IF NOT EXISTS Imagenes (url TEXT, local TEXT)");
                                    deleteDirectory(myDir);
                                    return false;   
                                }




                        } catch (MalformedURLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }catch (Exception e) {
                            e.printStackTrace();                            
                        }

                        if(!c.moveToFirst()){
                            //Insertamos los datos en la tabla Usuarios
                            db.execSQL("INSERT INTO Imagenes (url, local) " +
                                       "VALUES ('" + url + "', '" + local+".jpg" +"')");
                            Log.i("Inserta en la base de datos", "Inserta");
                        } else if (c.moveToFirst() && c2.moveToFirst()){
                            //Actualizamos el registro en la base de datos
                            db.execSQL("UPDATE Imagenes SET local='"+local+".jpg' WHERE url='"+url+"'");
                            Log.i("Actualiza en la base de datos", "Actualiza");
                        }
                        publishProgress((100/buttonsList.size())*(i+1));
                    } else {
                        Log.d(tag, "error");
                        db.execSQL("DROP TABLE Imagenes");
                        Log.d("Eliminada: ", "Base de datos eliminada");
                        db.execSQL("CREATE TABLE IF NOT EXISTS Imagenes (url TEXT, local TEXT)");
                        return false;
                    }
                } else {
                    try {
                        Thread.sleep(100);
                    } catch(InterruptedException e) {}
                    publishProgress((100/buttonsList.size())*(i+1));
                }
            }
当我运行我的应用程序时,日志会显示:

01-16 16:39:27.941: W/dalvikvm(14273): threadid=14: thread exiting with uncaught exception (group=0x41850ba8)
01-16 16:39:27.951: E/AndroidRuntime(14273): FATAL EXCEPTION: Thread-415
01-16 16:39:27.951: E/AndroidRuntime(14273): Process: com.example.aspace, PID: 14273
01-16 16:39:27.951: E/AndroidRuntime(14273): java.lang.NullPointerException
01-16 16:39:27.951: E/AndroidRuntime(14273):    at com.example.aspace.SplashActivity$MiTareaAsincrona$2.run(SplashActivity.java:312)
01-16 16:39:27.951: E/AndroidRuntime(14273):    at java.lang.Thread.run(Thread.java:841)
我有一个空指针,但我不知道为什么,我跟踪了inputstream、fos、size、buf的值,但没有人是空的,空指针出现在第二次迭代的页面上,特别是这一行:

while (((byteRead = inputStream.read(buf)) != -1)) {
我跟踪了read方法,没有返回null,我做错了什么?我认为我没有很好地使用线程。。。有什么建议吗?对不起,我的代码太长了,谢谢你抽出时间

while(((byteRead=inputStream.read(buf))!=-1)){

我跟踪了read方法,没有返回null,我做错了什么

在我看来,
inputStream
为空。查看代码后,我看到:

inputStream = null;
...
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
    inputStream = httpConn.getInputStream();
}
...
// thread does the read
因此,我怀疑响应代码不是200。如果响应代码不是
HTTP\u OK
,那么您可能应该从方法中返回,而不是派生线程来读取响应


将来,您可以像调试其他应用程序一样轻松地调试线程化应用程序。您只需在NPE附近放置一个断点,然后测试有问题的字段。调试可能会破坏线程化程序的计时,但仍然很有用。

正如@Gray已经说过的,您正在创建
inputStream
作为null,并且仅在响应为200时为其设置一个值。然后尝试在代码的另一个点中访问此对象

假设您的响应总是200不是一个好的做法,因为您每次运行任务时都依赖于来自连接的成功响应

您应该向它添加一些错误处理代码,这样您不仅可以避免空指针,还可以在出现错误时向用户提供适当的反馈


我想补充的另一件事是,在使用前不需要将
inputStream
设置为null,因为每个Java对象都已初始化为null。

感谢您抽出时间

通过删除以下行,问题已得到解决:

inputStream = null;
这是一个线程问题,我创建了多个线程,我正在初始化inputstream变量,而其他线程正在运行


谢谢大家的帮助和建议!

谢谢,但不是,我在IF条件之后跟踪了inputstream,并且从不为null。那么,如果响应不是200@JaviSanchezG,代码中会发生什么呢?响应总是200,我正在用数据连接测试应用程序……我想这就是问题所在,但我打印了inputstream的值with log,且从不为null…@gray最后一位只有在实例级别初始化时才为真。如果它是一个方法变量,那么他当然需要初始化它。是的,谢谢你的回答,我知道这不是一个好的做法,我用其他方法验证数据连接。但我仍然收到此错误,我不知道为什么?正在驱动我现在疯了!还有其他建议吗?@Gray,因为我确信这不是问题…我认为是线程问题或类似的问题…@JaviSanchezG,通过你在
isOnline()中所指的其他方法验证
method?如果是,那还不够。请看,即使用户有一个活动连接并通过了验证,仍然有许多响应可以返回,而不是200个(仍然需要处理)。请看这里。
inputStream = null;