Java 如何防止主线程执行下一行直到最后一行完全执行
首先,我对弹簧靴还不熟悉。我想抓取一个新闻网站,以便制作一个RESTAPI。 我所做的只是创建一个路由,负责在抓取新闻网站后为最新新闻创建json响应。 这是路线Java 如何防止主线程执行下一行直到最后一行完全执行,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,首先,我对弹簧靴还不熟悉。我想抓取一个新闻网站,以便制作一个RESTAPI。 我所做的只是创建一个路由,负责在抓取新闻网站后为最新新闻创建json响应。 这是路线 @GetMapping("/latest") public ArrayList<Result> scrape() { String title = ""; Document doc; Element body
@GetMapping("/latest")
public ArrayList<Result> scrape() {
String title = "";
Document doc;
Element body ;
ArrayList<Element> elements = new ArrayList<>() ;
ArrayList<Result> results = new ArrayList<>();
ArrayList<Element>li;
try {
doc = Jsoup.connect("https://timesofindia.indiatimes.com").get(); //error take place here
title = doc.title();
body = doc.body();
elements = body.getElementsByAttributeValue("data-vr-zone","latest");
System.out.println("Size "+elements.size());
li = elements.get(0).select("li > a");
System.out.println("WHole Data "+li.toString());
System.out.println(li.size());
int id = 0;
for(Element text : li ) {
id++;
String link = "";
if( text.attr("href") != "" && text.attr("title") != "" ) {
link = "https://timesofindia.indiatimes.com/" + text.attr("href") ;
results.add(new Result(id,text.attr("title"),link));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return results;
}
@GetMapping(“/latest”)
公共ArrayList scrap(){
字符串标题=”;
文件文件;
元素体;
ArrayList元素=新的ArrayList();
ArrayList结果=新建ArrayList();
ArrayListli;
试一试{
doc=Jsoup.connect(“https://timesofindia.indiatimes.com“”.get();//此处发生错误
title=doc.title();
body=doc.body();
elements=body.getElementsByAttributeValue(“数据虚拟区域”、“最新”);
System.out.println(“Size”+elements.Size());
li=elements.get(0)。选择(“li>a”);
System.out.println(“整个数据”+li.toString());
System.out.println(li.size());
int id=0;
用于(元素文本:li){
id++;
字符串链接=”;
if(text.attr(“href”)!=“”&text.attr(“title”)!=“”){
链接=”https://timesofindia.indiatimes.com/“+text.attr(“href”);
add(新结果(id,text.attr(“title”),link));
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
返回结果;
}
请有人帮助如何在java中处理这种情况
因为Jsoup.connect()
[这是输出][1]
[1]: https://i.stack.imgur.com/HubJD.png
堆栈跟踪:
2020-03-04T12:18:34.410009+00:00 heroku[路由器]:at=info method=GET path=“/latest”host=morning-waters-01018.herokuapp.com请求\u id=15a8fdba-e541-4aa2-a0df-34838b2e5f fwd=“47.30.171.180”dyno=web.1 connect=0ms服务=177ms状态=500字节=473协议=https
2020-03-04T12:18:34.399950+00:00应用程序[web.1]:尺寸0
2020-03-04T12:18:34.402793+00:00应用程序[web.1]:2020-03-04 12:18:34.402错误4---[io-17255-exec-5]o.a.c.c.c.[/].[dispatcherServlet]:路径[]上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常[请求处理失败;嵌套异常为java.lang.IndexOutOfBoundsException:索引:0,大小:0]根本原因
2020-03-04T12:18:34.402794+00:00应用程序[web.1]:
2020-03-04T12:18:34.402795+00:00应用程序[web.1]:java.lang.IndexOutOfBoundsException:索引:0,大小:0
2020-03-04T12:18:34.402796+00:00应用程序[web.1]:在java.util.ArrayList.rangeCheck(ArrayList.java:657)~[na:1.8.0_242-heroku]
2020-03-04T12:18:34.402797+00:00应用程序[web.1]:在java.util.ArrayList.get(ArrayList.java:433)~[na:1.8.0_242-heroku]
我认为Jsoup.connect(“https://timesofindia.indiatimes.com“”。get()
执行同步调用
您只需要找到错误的原因
最简单的方法
请将catch(IOException e)
更改为catch(Exception e)
将main()
方法添加到同一源文件中,在main()
中复制scrape()
的主体,并在IDE中运行main()
方法。您只需打印结果(不返回它们)
您可以尝试在main()
方法中调试代码
原因似乎是
elements=body.getElementsByAttributeValue(“数据虚拟区域”、“最新”)
元素
在这里是空的我认为Jsoup.connect(“https://timesofindia.indiatimes.com“”。get()
执行同步调用
您只需要找到错误的原因
最简单的方法
请将catch(IOException e)
更改为catch(Exception e)
将main()
方法添加到同一源文件中,在main()
中复制scrape()
的主体,并在IDE中运行main()
方法。您只需打印结果(不返回它们)
您可以尝试在main()
方法中调试代码
原因似乎是
elements=body.getElementsByAttributeValue(“数据虚拟区域”、“最新”)
元素
此处为空能否发布stacktrace?stacktrace显示IndexOutOfBoundsException能否发布stacktrace?stacktrace显示IndexOutOfBoundsException