2016-10-04 11 views
0

正しい位置にそれのデータを取得するために内部クラスを初期化する - デコード()メソッド。それを解析した後、私はShenzhenRecoderクラスでxmlファイルを構築しています。しかし、私は、ShenzhenDecoderクラス - assignStatusFlagMaptoRecorder()でデータを設定した後、statusFlagクラスからデータを取り出すという問題に直面しています。シンセデコーダー内のStatusFlagクラスを初期化して、データをcreateXMLFromRecord()にどこでどのように取得する必要がありますか? getStatusflag()がnullであるため、getStatusflag()およびgetStausFlag()の例外としてgetLowBattery()がnullになるためです。のJava:私はShenzhenDecoderクラスのメッセージを解析しています

ShenzhenDecoder

パブリッククラスShenzhenDecoder {

ShenzhenRecord record = null; 

LinkedHashMap<String, String> statusFlagMap = new LinkedHashMap<String, String>(); 


public ShenzhenRecord decode(final byte[] data) { 
     this.record = new ShenzhenRecord(); 
     byte[] imeiArray = Arrays.copyOfRange(data, 1, 16); 
     String imei = new String(imeiArray, "UTF-8"); 
     System.out.println("IMEI: " + imei); 
     this.record.setImei(imei); 

} 


private void assignStatusFlagMaptoRecorder() { 
    StatusFlag statusFlagRecord = this.record.new StatusFlag(); 
    for (Entry<String, String> entry : this.statusFlagMap.entrySet()) { 
     String key = entry.getKey(); 
     switch (key) { 
     case "lowBattery": 
      statusFlagRecord.setLowBattery(entry.getValue()); 
      break; 
     case "spare1BitFirstByte": 
      statusFlagRecord.setSpare1BitFirstByte(entry.getValue()); 
      break; 

     case "lbs": 
      statusFlagRecord.setLbs(entry.getValue()); 
      break; 
     case "gmsBlindArea": 
      statusFlagRecord.setGmsBlindArea(entry.getValue()); 
      break; 
     } 

    } 

} 

}

Shenzhenrecord

答えて

0
public class ShenzhenRecord { 

    private String imei; 
    private StatusFlag statusFlag; 


    public String getImei() { 
     return this.imei; 
    } 


    public void setImei(String imei) { 
     this.imei = imei; 
    } 

    public class StatusFlag { 

     private String lowBattery; 


     public String getLowBattery() { 
      return this.lowBattery; 
     } 


     public void setLowBattery(String lowBattery) { 
      this.lowBattery = lowBattery; 
     } 

    } 


    public Document createXMLFromRecord(String code) throws ApplicationException { 

     Document document = DocumentHelper.createDocument(); 

     Element shenzhenElement = document.addElement("shenzhen"); 

     shenzhenElement.addAttribute("imei", getImei()); 

     Element statusFlagElement = shenzhenElement.addElement("statusFlag"); 

     StatusFlag statusFlagtest = this.getStatusFlag(); 
     //Here I am getting an error because getStatusFlag() has null. 
     String lowBatteryTest = this.getStatusFlag().getLowBattery(); 

     statusFlagElement.addAttribute("lowBattery", this.getStatusFlag().getLowBattery()); 

     } 

    return document; 
} 

} 
StatusFlag statusFlagRecord = this.record.new StatusFlag(); 

は、新しく作成されたStatusFlagがレコードへの参照を持ち、 'ShenzhenRecord.statusFlag'フィールドが初期化されていないことを意味します。だからその行を削除し、ShenzhenRecordが初期化させ、それがOOPに意図だとして、それはフィールド自体です:

public class ShenzhenRecord { 
    private String imei; 
    private StatusFlag statusFlag = new StatusFlag(); 

    public String getImei() { 
     return this.imei; 
    } 

    public void setImei(String imei) { 
     this.imei = imei; 
    } 

    public static class StatusFlag { 

そして限り、内部クラスが自分の周囲のクラスへの参照を必要としないように、それらをマークするのは良い考えかもしれません静的なフィールドを初期化するより柔軟な方法に興味があるなら、コンストラクタと初期化子を見ることができます。

関連する問題