2013-12-21 4 views
0

Я получаю исключение nullPointerException при получении текстового представления в Android. Кажется, что когда-нибудь я смогу установить TextViews, и он будет работать, и когда-нибудь это не будет. Может кто-нибудь объяснить мне, почему я получаю от этого нульпоинт? Он находится в методе setTextView() в первой строке и вызывается из класса Net.Получение nullpointer с TextView

package com.tsunamistudios.computerwatch; 

import java.io.IOException; 
import java.io.OptionalDataException; 
import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.TextView; 

public class Client extends Activity { 

    private static String message; 
    private static ArrayList<Program> programs = new ArrayList<Program>(); 
    private static Net net; 
    private TextView txtView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_client); 
     new Thread(net = new Net()).start(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.client, menu); 
     return true; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     Client.message = message; 
    } 

    public ArrayList<Program> getPrograms() { 
     return programs; 
    } 

    public void setTextView() { 
     txtView = (TextView) findViewById(R.id.txtView); 
     txtView.setText(getPrograms().get(0).getName() + getPrograms().get(0).getDescription()); 
    } 

    public void setPrograms(ArrayList<Program> programs) { 
     Client.programs = programs; 
    } 

    public Net getNet() { 
     return net; 
    } 

    public void setNet(Net net) { 
     Client.net = net; 
    } 


    public TextView getTxtView() { 
     return txtView; 
    } 
} 

Net.java

package com.tsunamistudios.computerwatch; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.OptionalDataException; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Net extends Client implements Runnable { 

    private static Socket echoSocket; 
    private static PrintWriter out; 
    private static BufferedReader in; 
    private static ObjectInputStream inFromServer; 

    @Override 
    public void run() { 
     try { 
      String hostName = "192.168.0.105"; 
      int portNumber = 6984; 
      echoSocket = new Socket(hostName, portNumber); 
//   out = new PrintWriter(echoSocket.getOutputStream(), true); 
//   in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); 
      inFromServer = new ObjectInputStream(echoSocket.getInputStream()); 

      getPrograms().add((Program) getProgramsFromObject());   

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

    public static Socket getEchoSocket() { 
     return echoSocket; 
    } 

    public Object getProgramsFromObject() {  
     try { 
      if(getObjectInputStream() != null) { 
       return getObjectInputStream().readObject(); 
      } else { 
       return new Program("Nullpointer", "NullPointer", "Null", null); 
      } 
     } catch (OptionalDataException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public static void setEchoSocket(Socket echoSocket) { 
     Net.echoSocket = echoSocket; 
    } 

    public static PrintWriter getOut() { 
     return out; 
    } 

    public static void setOut(PrintWriter out) { 
     Net.out = out; 
    } 

    public static BufferedReader getIn() { 
     return in; 
    } 

    public ObjectInputStream getObjectInputStream() { 
     return inFromServer; 
    } 

    public static void setInFromServer(ObjectInputStream inFromServer) { 
     Net.inFromServer = inFromServer; 
    } 

    public static void setIn(BufferedReader in) { 
     Net.in = in; 
    } 

} 

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".Client" > 

    <TextView 
     android:id="@+id/txtView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="75dp" 
     android:layout_marginTop="162dp" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

Ошибка

12-21 12:57:17.043: E/AndroidRuntime(30909): FATAL EXCEPTION: Thread-1266 
12-21 12:57:17.043: E/AndroidRuntime(30909): Process: com.tsunamistudios.computerwatch, PID: 30909 
12-21 12:57:17.043: E/AndroidRuntime(30909): java.lang.NullPointerException 
12-21 12:57:17.043: E/AndroidRuntime(30909): at android.app.Activity.findViewById(Activity.java:1884) 
12-21 12:57:17.043: E/AndroidRuntime(30909): at com.tsunamistudios.computerwatch.Client.setTextView(Client.java:47) 
12-21 12:57:17.043: E/AndroidRuntime(30909): at com.tsunamistudios.computerwatch.Net.run(Net.java:30) 
12-21 12:57:17.043: E/AndroidRuntime(30909): at java.lang.Thread.run(Thread.java:841) 
+2

'txtView' - null. разместите свой xml-макет и опубликуйте класс net – Raghunandan

+0

, что-то не так происходит, когда android использует 'findViewById', чтобы найти ваше мнение. отправьте свой xml. –

+0

И почему у вас есть эта новая тема (net = new Net()). Start(); ' – Raghunandan

ответ

1

Ваш Net класс объявлен как

public class Net extends Client implements Runnable { 

По иерархии наследования, он также расширяет Activity, который имеет переменную window экземпляра, который будет инициализируется null по умолчанию. Когда вы звоните

setTextView(getTxtView()); 

он называет унаследованный метод

public void setTextView() { 
    txtView = (TextView) findViewById(R.id.txtView); 
    txtView.setText(getPrograms().get(0).getName() + getPrograms().get(0).getDescription()); 
} 

Но потому, что ваш Net является Activity, что не было дано Window на Android, он не внутренне. implementation из Activity является

public View findViewById(int id) { 
    return getWindow().findViewById(id); 
} 

где getWindow() вернется null.

Вам нужно будет пересмотреть свой дизайн. Действительно ли Net действительно должен быть Activity?

+0

не будет перегружен coz 'setTextView (getTxtView());' принимает param и 'public void setTextView()' no param в этом случае – Raghunandan

+0

@Raghunandan Я бы предположил, что OP показывает нам некоторый несинхронизированный код, потому что нет другой метод setTextView. Но ты прав. –

+0

Я изменил код, удалил клиент extends, но все не работает корректно, если я устанавливаю setTextView() в onCreate, потому что он идет до того, как Net завершит получение нужного мне объекта. –

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