我想从一个方法中指定的匿名类返回一个字符串。我想从方法parseXml返回respMessage。我不知道如何做到这一点,我不能把它作为一个类变量。请告诉我如何退货?我也无法使其成为最终因为必须分配本地最终变量而无法重新分配。
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 :(得分: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];
}
答案 1 :(得分:0)
最简单的解决方案是创建一个合适的类,或者至少定义一个local class:
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
:
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();
}
最后,最讨厌的解决方案是在初始化程序中调用parse()
方法并将结果返回到同一表达式中:
return new DefaultHandler() {
{
saxParser.parse(new InputSource(new StringReader(resXml)), this);
}
...
}.getRespMessage();