javacとjavaのバージョンを何度試しても合わせられない原因は、謎のjava.exeにあった

# 環境
購入元: 株式会社マウスコンピューター
ノート/デスクトップ: デスクトップPC
OS: Windows 10 Home 64ビット
CPU: インテル(R) Core(TM) i5-7400 プロセッサー ( 4コア / 4スレッド / 3.00GHz / TB時最大3.50GHz / 6MBキャッシュ )
メモリ: 16 GB (購入時点では8 GB)
HDD: 1TB HDD ( 7200rpm / 6Gbps 対応 )
SSD: 無し
グラフィックス: インテル HD グラフィックス 630
下記内容の実施日：2019年11月12日

# Hello worldで実行エラー
Javaの勉強を始めようと思い、環境構築のためEclipseとJDKをインストールし、Eclipseを日本語化した。
早速「Hello world」を出力しようと思い、ほぼコピペのコードをHello.javaに保存し、
`> javac Hello.java` 
でコンパイル成功。
`> java Hello`
で実行したが、エラーが発生。

```
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
```

調べたところ「javac (JDK)」と「java (JRE)」のバージョンが異なる（特に後者が古い）場合、このようなエラーになるとのこと。
実際にバージョンを確認したところ、

```
> javac -version
javac 13.0.1

> java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode)
```

やはり異なる。
元々入れていたJREの方が古いのだろうと思い、公式サイトから最新版に更新したが、バージョン表示は変わらない。
そこで「コントロールパネル」→「プログラムのアンインストール」からJava関連(JDK, JRE)を全てアンインストールし、「環境変数の設定」から関係すると思われるPathもすべて削除した。その後、JDKを再インストールし(このとき同時にJREも入るらしい)、Pathを通し直したが、やはりバージョン表示は変わらない。

両方ともアンインストールし、完全にJavaが入っていないはずの状態でバージョン確認のコマンドを実行したら、下記のように表示された。

```
> javac -version
'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

> java -version
Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: Could not find Java SE Runtime Environment.
```

javacの方はコマンド自体が無効なようだが、javaの方はコマンドとして認識された上でエラーになっている？

# 謎のjava.exeを発見
このとき、削除したJava関連のPathの中に、よく分からないもの（確か`C:\ProgramData\Oracle\Java`）があったことを思い出し、そのフォルダを開いてみたら、
![qiita_java.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420990/5d19f0f3-77e7-1775-4b41-9d134256c7fb.png)
なんと完全消去したはずのjava.exeが存在していた。
更新日時はPCを購入した日付になっている。元から入っていたものなのだろうか。
もう一度「プログラムのアンインストール」の一覧をよく見てみたが、これに対応するプログラムは見つけられなかった。
試しに「Oracle」フォルダの名前を「Oracle_nazonojava」に変更し、再度javaのバージョン情報のコマンドを実行したところ、

```
> java -version
'java' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

javacと同じく、コマンド自体が認識されなくなった。
変更したフォルダへのPathは（ユーザー環境変数・システム環境変数の双方から）削除したはずなのに、フォルダ名変更でコマンドの結果が変化するのはなぜだろう。実はPathが通ってしまっているのだろう（勉強不足）。

この状態でJDKを再インストールしたところ、無事バージョンが一致した（javaの方が、javacの方と同じバージョンに変わった）。

```
> javac -version
javac 13.0.1

> java -version
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
```

「Hello world」も無事コンパイル・実行することができた。

# 最後に
ググったところ、javaとjavacのバージョンが違うという例はあるが、いずれも再インストールすれば解決しており、今回の例と似たものはほとんど見つけられなかった。
（唯一、何度再インストールしてもJavaのバージョンが1.8.0_231のままという、今回のとほぼ同一な症例がYahoo! 知恵袋の質問（削除済）のGoogle キャッシュとして存在していた。）
環境（PCの購入元?）に依存するところが大きい問題かもしれないが、似た症状が発生する人がいるかもしれないので、記事として書いておく。