我有这个课程现在工作正常,但是我已经花了很多时间来努力改变它与我的第一种方法不同的逻辑。
public class MyClass {
public static MyClass tablas;
public static String[] GROUPS;
public static String[] ESTATUS
public static String[] CLIENTS;
public void init(){
this.tablas = new MyClass();
this.setGroups();
CLIENTS=this.setAny("/servlets/CLIENTS","page_rows","nombre");
ESTADO_PEDIDO= new String[]{"str1","str2","str3","str4","str5"};
}
private String[] setAny(String sevlet,String bigNode,String smallNode){
String[] ret=null;
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("operation", "4");
parameters.put("avance", "0");
InputStream is = Connection.con.processRequest("GET", sevlet, parameters);
Document dom = null;
try {
dom = UtilesDom.parseXML(is);
NodeList lines = dom.getElementsByTagName(bigNode);
Element el = (Element)lines.item(0);
NodeList nlist = el.getElementsByTagName(smallNode);
ret = new String[nlist.getLength()];
for (int i = 0; i < nlist.getLength(); i++) {
ret[i] = nlist.item(i).getTextContent();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return ret;
}
private void setGroups(){
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("operation", "4");
parameters.put("avance", "0");
InputStream is = Connection.con.processRequest("GET", "/servlets/GROUPS_CLIENTS", parameters);
Document dom = null;
try {
dom = UtilesDom.parseXML(is);
NodeList lines = dom.getElementsByTagName("lines");
Element el = (Element)lines.item(0);
NodeList nlist = el.getElementsByTagName("GROUP");
GROUPS = new String[nlist.getLength()];
for (int i = 0; i < nlist.getLength(); i++) {
GROUPS[i] = nlist.item(i).getTextContent();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
正如您所看到的,有两种类似的方法setGroups
和setAny
这些方法用于填充Strings[]
顶部。setGroups
是我原来的方法,但是当我需要时不同的Strings[]
认为a&#34;不太硬编码&#34;最灵活的方法会很好,所以我尝试了这个:
private void setAny(String sevlet,String bigNode,String smallNode,String[] which){
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("operation", "4");
parameters.put("avance", "0");
InputStream is = Connection.con.processRequest("GET", sevlet, parameters);
Document dom = null;
try {
dom = UtilesDom.parseXML(is);
NodeList lines = dom.getElementsByTagName(bigNode);
Element el = (Element)lines.item(0);
NodeList nlist = el.getElementsByTagName(smallNode);
which = new String[nlist.getLength()];
for (int i = 0; i < nlist.getLength(); i++) {
which[i] = nlist.item(i).getTextContent();
System.out.println(which[i]);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
使用如下调用:
this.setAny("/principal/Clientes","page_rows","nombre",CLIENTS);
也
this.setAny("/principal/Clientes","page_rows","nombre",this.CLIENTS);
和
this.setAny("/principal/Clientes","page_rows","nombre",this.tablas.CLIENTS);
问题在于,作为参数传递的String[]
(又名CLIENTS
)只保留null
,并且正确填充for loop
的en并且控制台显示它应该是什么。所以问题是:
为什么String[] CLIENTS
作为参数传递时无法填充,只能保持为null
?
PD:你可能会注意到英语不是我的语言,所以请提出任何语法/编辑/拼写......更正。
答案 0 :(得分:1)
好的,所以我假装你的参数是String[]
,而不是String
。
您的问题是,一旦使用new运算符创建新数组,您的引用将更改为该新数组。所以旧的不受影响。
所以是的,你创建了一个新阵列并正确填充它,但遗憾的是它不会是CLIENTS
。如果您在第一个示例中执行此操作并返回String Array以保存它,那将会有效。
另一种选择是创建一个String Arrays的静态HashMap,而不只是三个不同的静态String Arrays。然后,您可以将密钥传递给方法,只需在给定密钥处替换Array。这样您就不需要使用返回值。
答案 1 :(得分:0)
在运行时它是null
并且编译器不知道这一点。它在编译时严格检查类型。
setAny(String sevlet,String bigNode,String smallNode)
最后一个参数是一个String,你试图传递一个数组。您可能需要将签名更改为
setAny(String sevlet,String bigNode,String smallNode[])
这样它就会收到一个数组。