【问题标题】:How do you return the result of a method in java?如何在java中返回方法的结果?
【发布时间】:2013-01-23 12:16:36
【问题描述】:

这是我关于多个捕获块How to deal with returning an object and handling errors的问题的后续内容

我的更新代码如下,但是我收到一个错误,我的 draw() 方法必须返回一个 int,有没有办法让编译器识别 endOfDeck() 将返回一个 int,从而满足返回要求? (参见“返回 endOfDeck())

有什么更聪明的方法可以做到这一点?

import java.util.ArrayList;
import java.util.ListIterator;
/**
 * @author L
 *
*/
public abstract class Deck 
{

private ArrayList<Card> cards;
private ListIterator<Card> deckPosition = cards.listIterator();
private Card lastDrawn;
/**
 * 
 */
public Deck() 
{   
}

public int draw()
{

    try
    {
        if(deckPosition.hasNext())
        {
            lastDrawn = deckPosition.next();
            return 1;
        }
        else if(cards.isEmpty())
        {
            throw new EmptyDeckException();
        }
        else
        {
            throw new EndOfDeckException();
        }
    }

    catch(EmptyDeckException e)
    {
        emptyDeck();
        return 0;
    }
    catch(EndOfDeckException e)
    {
        return endOfDeck();

    }
    catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
        e.printStackTrace();
    }

}

public abstract int endOfDeck();
public abstract void emptyDeck();

}

【问题讨论】:

  • 你的默认返回值应该是多少?万一所有的事情都发生了?在你的最终捕获块中返回它
  • 不要对控制流使用异常。与其抛出 EmptyDeckException 并稍后处理它,不如直接在那里解决该案例。

标签: java return


【解决方案1】:

你的最后一个catch 块没有任何返回语句:-

catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
        e.printStackTrace();
    }

因此,如果执行该 catch 块,您的方法将不会返回任何值。可能您可以返回任何表示异常的整数,或者将异常包装在 RuntimeException 中并重新抛出它。


但是,您的代码似乎有些问题。您不必要地抛出异常。无论您在catch 块中做什么,都可以直接在if-else 块中执行。

因此,您可以将代码修改为:-

    try {
        if(deckPosition.hasNext())
        {
            lastDrawn = deckPosition.next();
            return 1;
        }
        else if(cards.isEmpty())
        {
            emptyDeck();
            return 0;
        }
        else
        {
            // throw new EndOfDeckException();  // Don't throw it
            return endOfDeck();
        }

    } catch(Exception e) {
        /** Also, if possible, replace this catch block with the one catching
            more specific exception than all the `Exceptions` **/
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
        throw new RuntimeException("Exception drawing a card");
    }

【讨论】:

  • 另外,如果我使用您建议的方法抛出一个新的 RuntimeException,这如何与 return 语句一起使用?等待接受您的回答,感谢您的帮助
  • @LinuxN00b.. 如果您遇到的异常无法恢复。即,您不想继续,以防万一出现异常,而不是返回任何任意整数,您可以将异常包装在 RuntimException 中,这是一个未经检查的异常,因此不应处理。在这种情况下,您的程序将停止,并给出相应的异常消息。
  • @LinuxN00b.. 因此,基本上,从一个旨在返回值的方法中,您要么返回所需的值类型,要么您可以抛出异常,这表示该方法的异常终止。
  • 太好了,感谢您发现问题并帮助我最终解决了未经检查的异常,我认为包罗万象会自动停止执行 :)
【解决方案2】:

您的底部catch 必须返回一个int 以满足所有代码路径。

catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
        e.printStackTrace();
        // Return needs to be here.
    }

或者,您需要在方法底部添加一个默认返回值。

【讨论】:

    【解决方案3】:

    当一个方法被声明为返回某些东西时,您必须确保通过该方法的每一个执行路径都会导致(未捕获的)异常传播到调用者或返回一个值。

    您的声明 return endOfDeck() 非常好,但是您的代码路径仍然没有返回:

    catch(Exception e)
        {
            System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
            e.printStackTrace();
        }
    

    如果发生这种情况,则说明编译器可以返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2021-05-06
      相关资源
      最近更新 更多