潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

コンパイルエラー「\65279は不正な文字です。」

Eclipse上で問題なく動いていたJavaコードに対して、コマンドラインからビルドをかけたところ表題のエラーが発生した。

 

\65279 = UTF-8のBOM(Byte Order Mark)

 

どうやらソースファイルの中に、エンコードUTF-8でBOMありのものが紛れ込んでいるらしい。

 

Windows機を使用していたので、手っ取り早い対処法にて対応した。

 

【対処方法】

 1. サクラエディタで対象ファイルを開く

 2. 名前をつけて保存を選択

 3. 文字コードセット、改行コードの右側のBOMチェックをOFFにする

    f:id:monokurotamago:20140301150305p:plain

 4. 保存する(上書き)

 

 

Eclipseでエラーにならなかったのに、なんでjavacだとエラーになるの?】

EclipseではJDTコンパイラを使用していて、コマンドラインではOracle純正コンパイラを使用していることが原因。

 

マシンの環境パスで指定するjava.exeは、普通はOracle公式サイトから落とした純正のものを利用する。コマンドラインコンパイルする時はこれが使われる。

一方で、Eclipseコンパイルする時には、Eclipseの中のjava.exeが使われる。このjava.exeはEclipse独自のもの。

 

そして重要な事は、

 eclipseコンパイラは純正コンパイラよりもコンパイルエラーとする条件が緩い。

ということ。

 

調べてみるとこんなのがあった。

 

 JDTコンパイラならOKだけど、純正コンパイラじゃ通らない記述

 http://d.hatena.ne.jp/eyamane/20061212/1165892799

 

 ECJ (Eclipse Compiler for Java) は面倒見が良すぎ…

 http://d.hatena.ne.jp/imatake/20100702/1278038592

 

知っていればたいしたことないけど、知らないとハマる罠。

 

 

オマケ

 JDT(Java Development Tools)の概要

 http://ossforum.jp/node/985

 

 なぜ EclipseJRE を使っているのにコンパイルできるの?

 http://www.hitachi.co.jp/Prod/comp/soft1/cosminexus/useful/tips/090606_eclipse-jre-compile.html