在Java中,是否可以从try-catch块返回多个值?
我想从控制台读取Id、名称和分数,以供其他使用。但是,这三个变量在try-catch块范围内。我想知道是否有任何方法可以从try-catch返回这三个值。(如果我不想将这三个变量分别放在三对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
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块更大的范围内”怎么样?