我正在尝试在Android应用上动态提取某些HTML标记之间的文本,例如<h4>,<h3>,<h2>
。我试图编写代码,但是一旦我尝试调用该函数,应用程序就会崩溃。
这是我的代码:
import java.util.ArrayList;
import java.util.List;
public class Extractor {
String code = ""; //--------------------------------Some HTML Code
List<Integer> fromIndex , toIndex;
List<String> headings;
public void populate() {
int index;
ArrayList<String> oTag = new ArrayList<>();
oTag.add("<h4>");
oTag.add("<h3>");
oTag.add("<h2>");
for (String ot : oTag) {
index = code.indexOf(ot);
while (index >= 0) {
fromIndex.add(index + ot.length());
index = code.indexOf(ot, index + ot.length());
}
}
ArrayList<String> cTag = new ArrayList<>();
cTag.add("</h4>");
cTag.add("</h3>");
cTag.add("</h2>");
for (String ct : cTag) {
index = code.indexOf(ct);
while (index >= 0) {
toIndex.add(index);
index = code.indexOf(ct, index + ct.length());
}
}
for(int i = 0 ; i < toIndex.size() ; i++)
{
headings.add(code.substring(fromIndex.get(i),toIndex.get(i)));
}
}
}
Android Studio显示的错误是:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at com.myuser.hplap.myapp.Extractor.populate(Extractor.java:50)
at com.myuser.hplap.myapp.MainActivity$1.onClick(MainActivity.java:38)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21158)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
变量code
是从包含网页完整HTML代码的活动发送的,但为了简单地表示它,我已将其包含在同一个类中。
此外,在为此寻找解决方案时,我已经看到了许多其他解决相同问题的方法(例如:正则表达式,XPath,HtmlCleaner等),但我很困惑哪种方法最适合我。有人可以推荐一种经过试验和测试的方法吗?
答案 0 :(得分:0)
您永远不会初始化List<String> headings
。
关于HTML标签问题,我认为这些可以让你开始:
如果您已经阅读过这些内容,并且没有得到您想要的答案(例如:what's wrong with HTMLParser?) - 那么请详细说明您的先决条件。