2011-08-31 84 views
9

我尝试让我的代码在没有错误且没有警告的情况下编译为标准实践。但有一个烦人的警告,我知道如何在.NET中处理,而不是在Java中处理。说我有一个代码块这样的:Java中的捕获块变量警告

try { 
     FileInputStream in = new FileInputStream(filename); 
     return new Scanner(in).useDelimiter("\\A").next(); 
    } catch (FileNotFoundException ex) { 
     LOG.log(Level.SEVERE, "Unable to load file: {0}", filename); 
     return null; 
    } 

我得到的变量ex不使用警告。现在,我并没有使用ex,我不想ex,但我不知道该怎么办。在.NET中我可以这样做:

catch (FileNotFoundException) 

没有变量,它会编译和运行没有错误。

在Java中如何处理这种情况?我知道我可以创建一个局部变量并将其设置为ex,但这似乎是一个愚蠢而浪费的解决方法,可以修复一个并非真正需要的警告。

+1

它在许多语言说的太容易了,我不明白这一点例外,所以我会忽略它。 Java采取保姆的方式告诉你这是一个值得处理的异常。 –

回答

6

有没有干净的方式在Java中“标记ex使用的”,除非使用它。

但请注意,根据its documentation一个FileNotFoundException也可以扔掉时“[...]文件确实存在,但由于某种原因无法访问,例如,当试图打开一个只读的写作文件“。

因此,我建议你使用例外也打印异常的消息。

我知道这并不回答一般问题,但我几乎想不出一个例外,当它发生时,我至少不会记录的某些信息。

+0

我将此标记为最佳答案,因为它在第一句中直接回答了我的问题。 – Sheridan

+0

“也通过打印来自异常的消息”这是使用异常文本('toString()')作为用户界面项目。我会说这是一个糟糕的主意:文本没有国际化,并且通常是面向程序员而不是用户的表单。 – Raedwald

+0

关于是否应该使用异常消息的更多想法:http://stackoverflow.com/questions/7320080/should-you-report-the-message-text-of-exceptions – Raedwald

11

登录异常。无论如何,追逐一个bug总是有用的。

+1

我同意:知道文件未找到的原因总是有用的。您可以将罚款或最佳级别的例外记录下来。 – Matteo

+3

非常赞同,请你自己帮忙'LOG.log(Level.SEVERE,“无法加载文件:”+ filename,ex);'。 –

+0

他记录异常。他的问题是来自编译器的虚假警告消息。 – Raedwald

1

如果我用javac的代码,我没有得到一个警告,所以无论您使用的是不同的编译器,或者不同的设置 - 我认为一个IDE使用与未使用的变量特殊设置。之前在管线@SuppressWarnings ("unused")

在Eclipse我把这种警告面向行了与注释,在这种情况下。

+0

他没有得到一个错误,他得到了一个警告。 – Paul

+0

你说得对,我纠正了它,因为在命令行上,我没有收到警告。我被他的句子搞糊涂了'在.NET中,我可以这么做:... catch(FileNotFoundException)...没有变量,它会编译并运行,没有错误。“但在其他地方,他清楚地谈论警告。 –

0

您应该记录异常。根据FileInputStream API,可以抛出FileNotFoundException“如果该文件不存在,是目录而不是常规文件,或者出于某种其他原因无法打开以供阅读”。如果你遇到这个问题,在你的日志文件中有更多的细节(比如堆栈跟踪)会使修复更容易。

2

警告是IDE的警告,你应该能够将其关闭。

但是,有很多原因可以引发FileNotFoundException,因此在此情况下您会想知道原因。

IntelliJ将0​​或ignored识别为故意忽略的异常或非空catch块,视您的设置而定。

3

基本上,你是SOL(你必须声明变量并且吸取警告),因为JAVA有点狂躁抑郁,或者至少是保姆,在它的开发方法中;这是又一个例子。即使你从不打算使用它,JAVA也会让你声明catch变量。这意味着你有一个未使用的变量躺在等待导致问题。虽然有很多关于“你需要处理这个异常变量”的评论,但这些评论却错过了这个问题的要点。问题是“我怎样才能得到这个未使用的变量警告”,该示例使用FileNotFound异常,但它可能是任何异常。问题不是关于FileNotFound异常,而是关于未使用的变量警告。

该问题的异常类型无关紧要。例如,我有一个管理数据缓冲区的类。它可以抛出异常的原因有几个,其中之一是数据缓冲区已满。所以,如果我尝试将数据放入完整缓冲区,我的函数可能会收到该异常。这是它在这种情况下唯一可以接受的例外。我有一个使用这个类的函数检测异常并扩展缓冲区。它不关心异常变量,它不记录异常,处理异常并继续前进。除了例外,我可以返回一个标志,指示缓冲区已满,但是打败了异常处理系统(系统中有其他例程,这个例外是一个错误,我用日志和消息处理它们给用户等)

所以,我可以设置IDE忽略未使用的变量警告。但这不是一个好主意,因为有时候不使用变量表示真正的问题(我错过了一段代码,或者我忘记了结束块注释或其他东西)。或者,至少我有一段未使用的代码可能会增加未来的混乱。我可以压制这个警告,但那只是一个混乱。底线是我必须放入一个未使用的变量,记录它为什么没有被使用,并且为了压制警告(所以QA并没有抱怨),所有这些都是因为JAVA想要保护我免于自己。

<rant> 

这是我用JAVA遇到的一个主要问题。 JAVA声称他们是认真的专业人员严肃的项目使用的严肃的编程语言。然而,他们认为这些同样严肃的专业人员总是犯下愚蠢的错误,他们需要从这些错误中得到保护。这几乎就像告诉外科医生他们不能使用手术刀,因为他们可以切割自己。如果你正在为业余爱好者制作玩具编程语言,那么你需要加入所有的保护措施。但是,如果你声称为专业人士制作语言,那就给专业人员提供他们工作所需的工具。他们是专业人员,给他们专业的工具。像强迫定义一个未使用的变量,不允许操作符超载,没有未签名的基元,基本上将用户类视为二等公民限制了工具集,并指出专业工程师并不全是专业人士的观点。我不介意警告 - 它们帮助开发过程更快。我不喜欢缺乏完整的工具集。这会导致周围的工作,错误,以及全新的错误来源。

不管怎样,遗憾的咆哮

</rant>