如何在java中返回方法的结果?

如何在java中返回方法的结果?,java,return,Java,Return,这是我关于多个捕捉块的问题的后续内容 下面是我更新的代码,但是我得到一个错误,我的draw()方法必须返回一个int,有没有办法让编译器识别endOfDeck()将返回一个int,从而满足返回要求?(请参阅“返回endOfDeck()) 有没有更聪明的方法来实现这一点 import java.util.ArrayList; import java.util.ListIterator; /** * @author L * */ public abstract class Deck { pr

这是我关于多个捕捉块的问题的后续内容

下面是我更新的代码,但是我得到一个错误,我的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();

}
import java.util.ArrayList;
导入java.util.ListIterator;
/**
*@作者L
*
*/
公共抽象类组
{
私人ArrayList卡;
私有ListIterator deckPosition=cards.ListIterator();
私人卡;
/**
* 
*/
公共甲板()
{   
}
公共int draw()
{
尝试
{
if(deckPosition.hasNext())
{
LastDrawed=deckPosition.next();
返回1;
}
else if(cards.isEmpty())
{
抛出新的EmptyCheckException();
}
其他的
{
抛出新的endofDeckeException();
}
}
捕获(清空异常e)
{
emptyDeck();
返回0;
}
捕获(EndofDeckeException e)
{
返回endOfDeck();
}
捕获(例外e)
{
System.out.println(“绘制卡片时出现异常,请检查卡片的draw()方法中的try/catch块”);
e、 printStackTrace();
}
}
公共摘要int endOfDeck();
公共摘要void emptyDeck();
}

上一个
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");
    }

底部的
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.
    }

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

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

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

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

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

您的默认返回值应该是什么?如果发生了所有狗屎事件?请在最终捕获块中返回该值。不要对控制流使用异常。与其抛出
EmptyDeckException
然后稍后处理它,不如直接在那里解决该情况。如果我使用您建议的方法抛出一个新的RuntimeException,这如何处理return语句?正在等待接受您的答案,谢谢您的帮助help@LinuxN00b..如果您得到的异常无法从中恢复。例如,您不想继续,如果您得到了一些异常,那么您可以p RuntimeException中的异常,它是未检查的异常,因此不应处理。在这种情况下,您的程序将停止,并给出相应的异常消息。@LinuxN00b..因此,基本上,从打算返回值的方法中,您可以返回所需的值类型,也可以抛出表示a的异常b该方法的正常终止。非常好,感谢您发现问题并帮助我最终解决未检查的异常,我认为catchall会自动停止执行:)