2010-05-06 22 views
4

在代码:为什么我必须给一个标识符?

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

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

+0

我不明白你的第一句话是什么意思。如果您从编译器发布错误消息,那将会有很大帮助。 – 2010-05-06 13:37:42

+2

可能编译器需要'IOException var'。不知道为什么这样的约束,但是,语言是语言,它有它的语法... – 2010-05-06 13:39:44

+0

@Andrzej编译器强制我(不会编译),直到行中标记为LINE 1我会给IOException的标识符 – 2010-05-06 13:40:09

回答

10

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

但如果你真的有一个很好的理由 省略 不使用它,您可以添加评论,说明你的观点,[UPDATE2]和/或要告诉你的IDE来抑制样的检查为特定的代码块(大多数IDE允许)[/ Update2]

更新:好吧,“不好的做法”可能太强大了:-)让我试着更好地解释我的观点。

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

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

+1

“被认为有害”的物品被认为是有害的。 – 2010-05-06 13:40:34

+1

@Peter,但我并没有忽略这个例外。我只是没有使用它。你想告诉我,在catch子句中不使用异常也是一种不好的做法吗? – 2010-05-06 13:41:55

+1

@认识我,知道你 - 你应该做一些事情,抓住例外。请看http://stackoverflow.com/questions/2142184/is-it-okay-that-i-sometimes-sink-my-exceptions – justkt 2010-05-06 13:42:55

0

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

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

你可以在Exceptions tutorial的更多信息。

作为一个有趣的注意,在Java 7中,捕获异常的语法有望小幅改变,因为multicatch和最终的重新抛出了例外。

+0

@justkt阅读我对彼得的回答的评论 – 2010-05-06 13:43:26

+0

@知道我知道你 - 尽管我和彼得在一起。你不应该排除异常。特别是不在图形界面出现问题的应用程序中,用户不知道它(除非您的代码正常完美地继续执行该错误,这非常不寻常)。看到我链接的SO链接的慷慨,丰富的理由和来自社区的许多协议。 – justkt 2010-05-06 13:45:13

+0

@justkt但我没有下沉这个例外。我赶上了它,并通知用户发生了什么事。如果我不会做那些会下沉的事情。 – 2010-05-06 18:07:49

5

编译器在调用你对这个正确的。 根据Java grammar,catch子句的“参数”必须同时具有类型和变量标识符。如果省略,程序文本不再是语法上正确的Java程序。

CatchClause:赶上(FormalParameter )块

FormalParameter:[最后]类型 VariableDeclaratorId

至于为什么事情是这样 - 我认为这是容易解析,并允许这里的选项不提供任何东西。通过使用异常对象对错误做出反应是非常普遍的,所以典型的情况是有一个变量,而不是忽略它。由于没有额外的性能成本,他们可能只是让你不使用它。根据我的经验,如果你没有引用catch块中的异常对象,没有IDE警告你一个未使用的变量。

1

简化其他答案 - 我认为 - 当你捕捉到一个异常时,你需要真正抓住一些东西,并且指定将会发生什么。这不是“如果出现问题就执行此代码”,它是“如果这个特定的事情出错了,请执行此代码”。

最佳做法是登录或重新抛出;如果你正在捕捉一个异常,那么而不是你想要登录或重新抛出的东西,你是否真的需要去捕捉它,或者你能否以另一种方式做到这一点?

+0

@Dean我绝对不能同意你的看法。这是我决定如何处理异常,如果我不想这样做,我应该能够这样做。我不认为创建一个未使用的变量也是一种好的做法。 – 2010-05-06 18:15:19

相关问题