递归调用函数,直到获得所需的输入

时间:2019-07-12 23:20:54

标签: java recursion

方法getHtmlFromUrl有时会导致Exception。但是,有时它会输出一个字符串。我将如何尽可能少地调用一次函数gainWorkingHtml,以便尽快从中获取字符串?

到目前为止,我已经尝试了基本的try / catch递归。我听说过有关尝试使用do {语句的信息,但不知道从那里去哪里。

  public static String obtainWorkingHtml() throws Exception {
    try {
      String randomUrl = "https://www." + randomWord() + ".com";
      return getHtmlFromUrl(randomUrl);

    } catch(Exception e) {
      return obtainWorkingHtml();
    }
  }

照原样,程序始终会产生一个字符串。有时会花费很长时间,但总是如此。理想情况下,它将花费更少。

编辑:我实质上是在尝试从可能存在或不存在的网站获取HTML数据。这可能会导致各种错误,因此,如果重要的话,我还没有定义预期的异常。

2 个答案:

答案 0 :(得分:0)

如果递归级别是无限/不确定的,则递归是一个坏主意。递归深度受堆栈大小的限制,在某些时候,您会收到一个StackOverflowError。为了达到相同的效果,但没有堆栈溢出的可能性,请清空catch块并将try/catch包裹在while(true)块中。

答案 1 :(得分:0)

我的方法如下:

public static String obtainWorkingHtml()
{
    String retValue = null;
    while( retValue == null )
    {
        final var randomUrl = "https://www." + randomWord() + ".com";
        try 
        {
            retValue = getHtmlFromUrl( randomUrl );
        }
        catch( Exception e ) { /* Deliberately ignored */ }
    }
    return retValue;
}

如果getHtmlFromUrl()永远不会返回一些有用的响应,它将仍然永远运行,但是至少它不会破坏堆栈。