Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,是否可以从try-catch块返回多个值?_Java_Try Catch - Fatal编程技术网

在Java中,是否可以从try-catch块返回多个值?

在Java中,是否可以从try-catch块返回多个值?,java,try-catch,Java,Try Catch,我想从控制台读取Id、名称和分数,以供其他使用。但是,这三个变量在try-catch块范围内。我想知道是否有任何方法可以从try-catch返回这三个值。(如果我不想将这三个变量分别放在三对try-catch块中,)感谢您的时间 以下是我的示例代码: StuManage sm = new StuManage(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System

我想从控制台读取Id、名称和分数,以供其他使用。但是,这三个变量在try-catch块范围内。我想知道是否有任何方法可以从try-catch返回这三个值。(如果我不想将这三个变量分别放在三对try-catch块中,)感谢您的时间

以下是我的示例代码:

    StuManage sm = new StuManage();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Please enter the student ID: ");
    try {
        String Id = br.readLine();
        String name = br.readLine();
        float score =Float.parseFloat(br.readLine());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

很容易,您就不能这样做,因为try-and-catch块用于检查代码块的错误,因为代码块不应该在try块之外被访问以进行真正的测试。

只要确保变量以其默认值声明为方法的全局变量,这样,在整个方法中访问它们就可以了


另一种解决方案是从方法中删除
try/catch
,而将
try/catch
放在
main
方法中,这样您可以让异常(如果有)冒泡到main方法中,然后在那里处理它们,您也将从中受益,因为您不再需要担心范围问题。

是的,您可以声明并将其初始化为无效值

 String id = null;
 String name = null;
 float score = 1.0f;
 try {
       id = br.readLine();
       name = br.readLine();
       score = Float.parseFloat(br.readLine());
 } catch (IOException e) {

然后,您需要在try块之后检查哪些值仍然有效,哪些初始值无效…

是。只需将该方法声明为
抛出IOException
,并删除try catch即可。

您可以将这三个值封装到一个对象中。你的想法听起来很糟糕。这三个想法中至少有一个导致了例外。这可能意味着该方法不成功。报告(例如,向诊断日志记录)您成功读取的值在捕获中可能很有用。但是,任何依赖于成功读取这三个值的操作都应该发生在
throw
块中,而不是在catch或after中。请注意,虽然这是可能的,而且通常都会发生,但如果您必须在try/catch之后检查变量,这是一种反模式。不完全状态的风险相当高。它通常要求更多的封装或在不同的位置处理异常。在大多数用例中,最好编写方法在异常时以默认值退出。@LewBloch您认为违反了哪种约定?它是
Id
作为变量名,有人在我发表评论后编辑了这篇文章。不抛出那些异常如何?在中断时放弃对异常的责任是个坏主意。有些方法可以合理地抛出已检查的异常,但接收该异常的方法不属于该类别。至少,记录异常并离开方法;愚蠢的
e.printStackTrace()习语”是一个奇怪的比喻。那么会发生什么呢?下面的代码可能依赖于结果,现在无效,因此会有错误,因为
catch
块实际上没有履行其职责来实际捕获异常,而不仅仅是删除异常。默认值在大多数情况下不存在或不适用于对象模型。捕获异常意味着中断流。通常的习惯用法是捕获并记录异常,关闭任何辅助资源,然后退出该方法。“方法的全局性”意味着实例或类状态,几乎可以肯定是过度杀戮。仅仅“在比try-catch块更大的范围内”怎么样?