在java源文件的末尾清空新行

在我目前的项目中,我们总是在java源文件的末尾插入空的新行。 我们还用CheckStyle(错误级别)强制执行此操作。

我正在寻找这个话题很长一段时间,但不幸的是我找不到任何有说服力的理由。 似乎其他开发人员对此非常漠不关心,因为他们只是在eclipse格式化器中检查了一个checkbox,并且它是自动完成的。 但我仍然不知道为什么它是必要的,为什么它可能是重要的)。 所以我的问题是:

为什么在Java源文件末尾需要空行? 在目前的代码基础上,这是当前的需要还是过去的遗留问题?

我认为他们试图确保每个文件都以一个尾随的换行符结尾。 这与以空白行结尾,又名空白换行符不同。

编辑:由于@Easy天使在评论中简洁地澄清:拖尾newline =“\ n”和空白行=“\ n \ n”

我认为:

  1. 你的主要任务是要求每个文件以换行符结尾,但是被误解为要求每个文件以空行结束(即以换行符结尾的空行),否则

  2. 他们试图确保每个文件以换行符结尾,通过实际强制每个文件末尾有一个空行(即以换行符结尾的空行),从而确保文件以至less一个换行符结束(可能还有冗余的额外换行符 – 过度杀毒?)。

除非编辑器实际上显示换行符号,否则在某些编辑器中并不总是显示一个文件:

  1. 根本不要结束换行,
  2. 结束一个单行尾换行符,或
  3. 结束一个空白的换行符,即2个换行符

我认为大多数现代的源代码编辑器插入一个尾随的换行符。 然而,当使用更老的更一般的编辑器时,我总是试图确保我的源代码文件(和一般的文本文件)总是以一个尾随的换行符结尾(偶尔以空白行/空换行符出现,这取决于我是使用)是因为:

  1. 当使用cat在命令行上显示文件时,如果文件没有尾随的换行符,则下一个输出(如shell提示符或脚本可能在文件之间输出的可视分隔符)将最后出现在最后一个非换行符而不是从换行开始。 一般来说,尾随的换行符使得文件对用户和脚本更友好。

  2. 我相信有些编辑(我不记得任何细节)会自动插入一个尾随的换行符,如果文本文件缺乏。 这将使它看起来像文件被修改。 如果在不同的窗口中打开了一堆文件,然后closures所有的文件,编辑器会提示您保存,但是您不确定是对文件进行了“真正的修改”,还是只是在“插入换行符。

  3. diff和一些编译器的一些工具会抱怨失踪的尾随换行符。 这是用户和工具可能需要处理的更多噪音。


编辑:

关于编辑器添加换行符,而不能看到文件末尾是否有换行符和空白换行符,我刚刚testing了Vim,Eclipse和Emacs(在我的Windows系统上用Cygwin):我打开了一个新文件,input' h'e''l''l''o'并保存而不会按[ENTER]。 我用od -c -t x1检查了每个文件。

  1. Vim添加了一个尾随的换行符。
  2. Emacs添加了一个尾随的换行符。
  3. Eclipse 没有添加尾随的换行符。

  1. Vim不允许我把光标放到“hello”下的空白行。
  2. Emacs 确实允许我将光标放在“hello”下的空白行。
  3. Eclipse不允许我把光标放到“hello”下面的空白行。

解释你喜欢的。


我个人的做法是尽量确保文本文件以换行符结尾。 我只是觉得有这样的情况,人和工具是最不让人惊讶的。 在这方面,我不会将源文件与文本文件区别开来。

谷歌变成这样 :

在这个编辑中,它显示了关于来自C编译器,svn(由于diff),diff等引起的关于缺less的后续换行符的警告的命中。我感觉有一个普遍的期望,即文本文件(包括源文件)以一个尾随的换行符,当他们倾向于在那里时,最不令人惊讶(也不那么吵闹)。

最后这是有趣的:

消毒没有尾随换行符的文件
文本文件应该由换行符(即\ n)结尾。 这是由POSIX声明,即文本文件是

包含组成零个或多个行的字符的文件。
一条线又被定义为
*零个或多个非字符加终止字符的序列。


但是 ,所有这些只是我个人的做法。 我很乐意与任何人分享我的意见,但我不强迫任何人。 我不认为这是值得强制的东西,就像我在这里所说:

虽然我是一个一致的人,但我也反对微观pipe理每一个风格。 拥有大量的编码规则,特别是其中一些似乎是任意的编码规则,是阻止人们遵循它们的一部分。 我认为编码指南应该精简到提高能力的最有价值的实践。 通过强制这种做法,可读性,可维护性,性能等有多大提高?

最后有一个额外的换行符是一个很好的理由:

如果你最后有一个没有换行符的文件,下一次文件被编辑添加另一行时,大多数合并工具会认为现有的行已经改变了(我90%肯定SVN也这样做)。

在下面的示例中,包含“编辑前最后一行”的行不包含换行符。 如果我们试图添加一个新行“编辑后的最后一行”,我们可以看到第5行和第6行都被标记为已更改,但是第5行的实际内容是相同的。

EOF之前没有换行符

如果每个人都跟随你的项目主angularbuild议,那么这将是结果(只有第6行不同于原始文件)。 这也避免了合并过程中的误解。

在EOF之前进行换行

虽然这可能不是什么大不了的事情,但我们可以说一个开发人员(A)实际上是要改变最后一行的内容,另一个开发人员(B)添加了一个新行。 如果在EOF之前没有使用换行符,那么就会出现合并冲突,因为开发者B被迫也要编辑前一行来添加换行符。 而且…谁喜欢CVS / SVN冲突?

看看这个SO问题。 。

Ralph Rickenbach无耻的回答:

如果文本文件中的最后一行数据没有以换行符或回车/换行符组合结尾,则许多旧工具行为exception。 他们忽略那条线,因为它是用^ Z(eof)来代替的。

所以我认为这主要是过去的鬼魂。 不幸的是,如果你没有妥善驱除这些鬼,这些鬼可以咬你。 (您的构build服务器是否旧,并使用较旧的shell脚本进行摘要等等)。

尝试剪切/粘贴整个文件。 在checkstyle或日食中的东西错误:)

有时你的编译器不能正确parsing它:

Error: Reached end of file while parsing

除了已经提到的具有尾随换行符的有效理由(旧的工具和差异可能存在的问题)之外,还有另一种方法来看待它:

当文件中的每一行都有一行时,为什么特殊情况下最后一行没有附加换行符呢?

这只是一种编码风格。 不伤害或帮助任何东西。 我不会让它打扰你听起来像是你的团队偏好包括和空行。 除了为什么有人照顾足以真正将它添加到checkstyle之外,没有什么好的反驳呢?

我从来没有听说过这样的要求。

事实上,我刚刚确认,如果文件末尾没有空白行,Java程序将运行时不会出现任何编译器/运行时错误或警告。

正如一些评论者所说,这是一个编码风格问题。 不幸的是,我不能提出为什么在Java文件的末尾有一个空行是很重要的。 实际上,对我来说这似乎毫无意义

我们必须为一些C ++代码做这件事,因为编译器产生了一个警告,我们有一个“没有错误或警告”的政策。 也许问题在于其他地方…你有一个差异化工具已经走了干扰或合并工具,不能处理它?

这真的没什么大不了的