在代码中:
try
{
System.out.print(fromClient.readLine());
}
catch(IOException )//LINE 1
{
System.err.println("Error while trying to read from Client");
}
Run Code Online (Sandbox Code Playgroud)
在标记为LINE 1的代码行中,编译器强制我提供标识符,即使我没有使用它.为什么这种不自然的约束?然后,如果我键入一个标识符,我会收到警告,标识符未被使用.这对我来说没有意义,迫使程序员做一些不必要的和剩余的事情.在我之后,有人会修改这段代码,并且想知道我是不是在purpouse上使用这个变量,或者我忘记了.所以为了避免这种情况,我必须编写额外的注释来解释为什么我不使用我的代码中不必要的变量.
谢谢
Pét*_*rök 10
标识符名称是使编译器的解析更简单所必需的.省略catch子句中的异常被认为是不好的做法恕我直言很少有一个好主意 - 在生产代码中你应该(几乎总是)打印/记录它和/或重新抛出它.因此,不使用标识符名称应该是例外(没有双关语意)而不是规则.
但是如果你真的有理由省略不使用它,你可以添加一个注释来解释你的观点,[Update2]和/或告诉你的IDE禁止对那个特定的代码块进行那种检查(大多数IDE都允许这样做) )[/ Update2].
更新:好的,"糟糕的做法"可能太强了一句话:-)让我试着更好地解释我的观点.
我的意思是,通常当您捕获异常时,最好尝试记录/使用尽可能多的信息.这意味着您实际上引用了异常变量.
在上面的示例中,如果您只记录"尝试从客户端读取时出错",那么信息量非常有限.问题的实际原因可能是(只是几个猜测)一个损坏的文件,网络错误,格式错误......在IOException中记录数据将提供更多关于它的细节,使问题更容易修复.
编译器在调用此方时是正确的.根据Java语法,catch子句的"参数"必须同时具有类型和变量标识符.如果省略,则程序文本不再是语法正确的Java程序.
CatchClause:catch(FormalParameter)Block
FormalParameter:[final] Type VariableDeclaratorId
至于为什么事情是这样的 - 我认为它更容易解析,并且在这里允许选项并不能为您提供任何东西.通过使用异常对象来对错误做出反应是很常见的,因此典型的情况是拥有一个变量,而不是省略它.由于没有增加的性能成本,它们可能只是允许您不使用它.根据我的经验,如果您没有引用catch块中的异常对象,则没有IDE会警告您有关未使用的变量.