2012-04-07 3 views
0

Я пытаюсь сохранить все объекты сообщений, полученные за одну минуту, до карты дерева и после завершения одного mintue, сериализовать ее и вернуть байт [] в другой класс, тем временем очистить карту и начать хранить сообщения, полученные в следующий мин и т. д.Получение java.lang.NullPointerException

public class StoreMessage extends Thread implements Serializable{ 

    public static byte[] b=null; 
    public static Map <Long,Message> map1=Collections.synchronizedMap(new TreeMap<Long,Message>()); 
    public static Calendar c1=Calendar.getInstance(); 
    public static int year=c1.get(Calendar.YEAR); 
    public static int month=c1.get(Calendar.MONTH); 
    public static int day=c1.get(Calendar.DAY_OF_MONTH); 
    public static int hour=c1.get(Calendar.HOUR_OF_DAY); 
    public static int min=c1.get(Calendar.MINUTE); 
    public static GregorianCalendar gc = new GregorianCalendar(year, month, day, hour, min); 
    public static Date d=gc.getTime(); 
    public static long time1=(d.getTime())/60000; //precision till minute of the time elapsed since 1 Jan 1970 
    public static long time2=time1+1; 
    public static byte[] store(Message message)throws Exception{ 

    while(true) 
     { 
      if(time1<time2) 
      { 
       long preciseTime=TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis())+(System.nanoTime()-startNanotime); 
       map1.put(preciseTime, message); 
      } 

      else 
      { 
       b=Serializer.serialize(map1); 
       map1.clear(); 
       time1=time2; 
       time2++; 
          return b; 
      } 

      } 
     } 
    }  

Почему этот код дает мне исключения нулевого указателя подсветка INT Len = b.length; другого класса, где он вызван, чтобы вернуть значение?

public static void record(Message message){ 
     try{ 
      //storing the serialized message in byte[] 
      byte[] b =StoreMessage.store(message); 
      int len=b.length; //<--highlights this line for null pointer exception 

Даже после принятия вносит изменения (т.е. размещая возврат внутри блока еще), он не возвращает управление классом вызова. Кроме того, no Оператор SOP (при добавлении) печатается внутри блока else. Зачем?

The Serializer class 
    public class Serializer { 
     //serializes an object and returns a byte array 
     public static byte[] serialize(Object map) throws IOException 
      { 
      ByteArrayOutputStream b = new ByteArrayOutputStream(); 
      ObjectOutputStream o = new ObjectOutputStream(b); 
      o.writeObject(map); 
      return b.toByteArray(); 
      } 

     //de-serialization of the byte array and returns an object 
     public static Object toObject (byte[] bytes) 
     { 
      Object obj = null; 
      try 
      { 
      ByteArrayInputStream bis = new ByteArrayInputStream (bytes); 
      ObjectInputStream ois = new ObjectInputStream (bis); 
      obj = ois.readObject(); 
      } 
      catch (Exception ex) { } 
      return obj; 
     } 
    } 
+0

вы имели в виду, чтобы положить 'вернуть b' вне остальное-отрасли? Он по-прежнему инициализируется как «null», потому что сначала будет выполняться if-ветвь. – Howard

+0

Ваш StoreMessage.store (...) возвращает значение null, так как b всегда равно null. Извините, но это ужасный код - почему весь статический хлам? –

+0

Я бы предположил, что 'b' равно null. –

ответ

0

Это потому, что ваша b переменная null. См. Здесь:

Вы вводите метод и делаете чек if(time1<time2). Это true. таким образом, вы не заходите в другое и не инициализируете b. Послесловие вы идете и возвращаете значение b. Это null. Вы ответили неверно, если вы спросите меня. Поместите возвращение в заявлении еще, так что вы убедитесь, что цикл завершается, и все же вы будете инициализировать массив перед возвращением:

while(true) { 
    if(time1<time2) { 
     long preciseTime=TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis())+(System.nanoTime()-startNanotime); 
     map1.put(preciseTime, message); 
     } else { 
     b=Serializer.serialize(map1); 
     map1.clear(); 
     time1=time2; 
     time2++; 
     return b; 
     } 
} 
} 
+1

Или разместить его внутри else, где ' b', как известно, устанавливается (особенно учитывая, что это 'while (true)' - ваш подход никогда не завершится). (Я понятия не имею, какова цель логики.) –

+0

@HotLicks Ах, да, вы правы. исправляя его. Спасибо. –

+0

если я поместил его на улицу во время цикла .. это дает мне ** недостижимый код ** – kuks

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