我试图从字符串中获取指定的键值,但是当代码到达此行时,会不断抛出nullpointerexception:
splitter.httpHost = ((String)splitter.map.get("Host")).replaceAll(":([\\d]+)", "");
以下是完整的代码:
public class InjectDataSplitter {
private String tmpHost;
private String b;
private int httpPort = 0;
private String httpHost;
private HashMap<String, String> map = new HashMap<String, String>();
private String e;
private String f;
public InjectDataSplitter(String str) {
this.tmpHost = str;
}
public static InjectDataSplitter get_data_splitter(String str) {
InjectDataSplitter splitter = new InjectDataSplitter(str);
splitter.b = splitter.tmpHost;
//Split the supplied string
String arraystring[] = splitter.tmpHost.split("\r\n", 2);
for(int x = 0; x < arraystring.length; x++) {
String arraystring1[] = arraystring[x].split(" ");
for(int y = 0; y < arraystring1.length; y++) {
splitter.e = arraystring1[y];
splitter.f = arraystring1[y];
}
String arraystring2[] = arraystring[x].replace("\r\n\r\n", " ").split("\r\n");
for(int i = 0; i < arraystring2.length; i++) {
try {
String arraystring3[] = arraystring2[i].split(":");
splitter.map.put(arraystring3[1], arraystring3[2]);
} catch(Exception e) {
}
splitter.httpHost = ((String)splitter.map.get("Host")).replaceAll(":([\\d]+)", "");
Pattern pattern = Pattern.compile(":([\\d]+)");
if(!splitter.e.equals("CONNECT")) {
String s1 = splitter.f;
s1 = splitter.b;
Matcher matcher = pattern.matcher(s1);
if(!matcher.find()) {
//find each match in turn
//find each match in turn
int j = Integer.parseInt(matcher.group(1)); //Access a submatch group
boolean flag = splitter.e.equals("CONNECT");
if(flag){
j = 443;
}else{
j = 80;
}
splitter.httpPort = j;
}
}
}
}
return splitter;
}
有人可以解释我出错的地方吗?
答案 0 :(得分:0)
当您尝试在null对象上调用方法时,会出现NullPointerException。
如果你说的话就会出现错误,那就意味着((String)splitter.map.get(&#34; Host&#34;))为空。
答案 1 :(得分:0)
你得到一个NullPointerException,因为这部分代码中的某些东西是空的
splitter.map.get("Host")
调试并找出,究竟是什么null。我想,map
不包含字符串Host。您的代码中有一个致命的危险部分,当您尝试加入map
catch(Exception e) {
}
可能有例外,但一般来说隐藏异常是不好的。写下至少这个:
catch(Exception e) {
e.printStackTrace();
}
看看是否有例外。
答案 2 :(得分:0)
在上面的类中调用的字符串参数是:
代码:
String str = A.c(socks.getInputStream());
DataSplitter dataSplitter = DataSplitter.get_data_splitter(str);
我进一步调试,发现该地图不包含名为&#34; Host&#34;的任何字符串键值。关于如何使用hashmap获取映射密钥的想法。关于如何重组我的代码,请进一步提出建议吗?