为什么我要提供标识符?

时间:2010-05-06 13:36:34

标签: java exception

在代码中:

try
{
    System.out.print(fromClient.readLine());
}
catch(IOException )//LINE 1
{
     System.err.println("Error while trying to read from Client");
}

在标记为LINE 1的代码行中,编译器强制我提供标识符,即使我没有使用它。为什么这种不自然的约束?然后,如果我键入一个标识符,我会收到警告,标识符未被使用。这对我来说没有意义,迫使程序员做一些不必要的和剩余的事情。在我之后,有人会修改这段代码,并且想知道我是不是在purpouse上使用这个变量,或者我忘记了。所以为了避免这种情况,我必须写下额外的注释来解释为什么我不使用我的代码中不必要的变量 感谢

4 个答案:

答案 0 :(得分:10)

需要标识符名称才能使编译器的解析更简单。并且在catch子句中省略异常是被认为是不好的做法恕我直言,很少有好主意 - 在生产代码中你应该(几乎总是)打印/记录它和/或重新抛出它。因此,不使用标识符名称应该是例外(没有双关语意)而不是规则。

但是如果你真的有充分理由省略不使用它,你可以添加评论来解释你的观点, [Update2] 和/或告诉你IDE禁止对特定代码块进行检查(大多数IDE允许这样做) [/ Update2]

更新:好的,“糟糕的做法”可能过于强烈了:-)让我试着更好地解释一下我的观点。

我的意思是,通常当您捕获异常时,最好尝试记录/使用尽可能多的信息。这意味着你实际上引用了异常变量。

在上面的示例中,如果您只记录“尝试从客户端读取时出错”,那么信息量非常有限。问题的实际原因可能是(只是几个猜测)一个损坏的文件,一个网络错误,一个格式错误......在IOException中记录数据将提供更多关于它的细节,使问题更容易修复。 / p>

答案 1 :(得分:5)

编译器在调用此方时是正确的。 根据{{​​3}},catch子句的“参数”必须同时具有类型和变量标识符。如果省略,则程序文本不再是语法正确的Java程序。

  

CatchClause:catch(FormalParameter   )阻止

     

FormalParameter:[final]类型   VariableDeclaratorId

至于为什么事情是这样的 - 我认为它更容易解析,并且在这里允许选项并不能为你提供任何东西。通过使用异常对象来对错误做出反应是很常见的,因此典型的情况是拥有一个变量,而不是省略它。由于没有增加的性能成本,它们可能只是允许您不使用它。根据我的经验,如果您没有引用catch块中的异常对象,则没有IDE会警告您有关未使用的变量。

答案 2 :(得分:1)

简化其他答案 - 我认为 - 当你遇到异常时,你需要实际捕获一些东西,然后你要指明那将是什么。它不是“如果出现问题就执行此代码”,它是“执行此代码,如果特定事情出错”。

最佳做法是记录或重新抛出;如果你正在捕捉一个你要记录或重新抛出的异常的例外,你真的需要抓住它,还是你可以用另一种方式完成它?

答案 3 :(得分:0)

在你的catch中,你定义了被捕获的变量,而不仅仅是异常的类。它在语义上类似于IOException ex = new IOException()。你应该实际使用变量。在SO上查看Is it okay that I sometimes sink my exceptions中的所有理性。正如您所做的那样记录异常提供了一些信息。理想情况下,您的代码应该以某种方式处理异常,即使它只是向客户端报告错误(如果您的应用程序是控制台应用程序,它将会执行此操作)。

如果您有catch(IOException ex),您还可以使用ex.printStackTrace()获取完整堆栈跟踪,使用本地化消息等。这对调试很有帮助。试试吧!

您可以在Exceptions tutorial

中获取更多信息

有趣的是,在Java 7中,捕获异常的语法预计会略有变化,因为multicatch和最后的重新抛出都是例外。