2017-02-24 13 views
1

メソッド内で指定されている匿名クラスから文字列を返したい。ここでは、parseXmlメソッドからrespMessageを返す。私はこれを行う方法がわかりません、私はクラス変数としてそれをすることはできません。これを返す方法を教えてください。ローカル最終変数を割り当てる必要があり、再割り当てすることができないため、最終確定することもできません。メソッド内のananymous内部クラスから変数を返す方法

private String parseXml(String resXml) { 
    logger.info("In sax parsing"); 
    //final String respMessage; 

    try { 

     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 

     DefaultHandler handler = new DefaultHandler() { 

      boolean isResMessage = false; 
      protected String respMessage; 

      public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

       if (qName.equalsIgnoreCase("ErrorMessage")) { 

        isResMessage = true; 
       } 
      } 

      public void characters(char ch[], int start, int length) throws SAXException { 

       if (isResMessage) { 

        respMessage = new String(ch, start, length); 

        isResMessage = false; 
       } 
      } 

      public String getRespMessage() { 
       return this.respMessage; 
      } 
     }; 

     saxParser.parse(new InputSource(new StringReader(resXml)), handler); 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 

    return this.DefaultHandler().getRespMessage(); 
} 

答えて

0

匿名クラスでは、囲みメソッドから最終的ではないローカル変数を使用することはできません。一つの要素の最後の列を使用して、あなたの匿名クラスは、要素を変更することができます:

try { 

     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     final String[] result = new String[1]; 

     DefaultHandler handler = new DefaultHandler() { 
      void someMethod() { 
       result[0] = ...; 
      } 
      ... 
     }; 
     ... 
     return result[0]; 
    } 
0

最も簡単な解決策は、適切なクラスを作成し、または少なくともlocal classを定義することです。しかし、よく知られたトリックがあります:

private String parseXml(String resXml) { 
    final StringBuilder respMessage = new StringBuilder(); 
    try { 
     ... 
     DefaultHandler handler = new DefaultHandler() { 
      ... 
      respMessage.append(new String(ch, start, length); 
      ... 
     } 
     saxParser.parse(new InputSource(new StringReader(resXml)), handler); 
    } 
    ... 
    return respMessage.toString(); 
} 

最後に、:

try { 
    ... 
    class Handler extends DefaultHandler { 
     ... 
    } 

    Handler handler = new Handler(); 
    saxParser.parse(new InputSource(new StringReader(resXml)), handler); 
    return handler.getRespMessage(); 
} catch (Exception e) { 
    ... 
    return null; 
} 

あるいは、たとえばStringBuilderのために、あなたのクラスの外側可変リファレンスを使用することができますハッキーな解決策は、イニシャライザでparse()メソッドを呼び出して、同じ式で結果を返すことです。

return new DefaultHandler() { 
    { 
     saxParser.parse(new InputSource(new StringReader(resXml)), this); 
    } 
    ... 
}.getRespMessage(); 
関連する問題