プログラミングのざっくり豆知識~WindowsとmacOSの違いによるトラブル~

プログラミング学習には、様々な躓きポイントが存在しますが、その中でも独学だとなかなか答えを探し出すのが難しいポイントについて、この記事では解説をしていこうと思います。

特に、WindowsやMacOSの違いなどといった、環境による違いなどはたいていの場合解説されていないため、今回の記事ではそのあたりに焦点を絞っていきたいと思います。

ポイント1:プロジェクトを保存するフォルダ名について

皆さんJavaのクラスを作成する際には、まずはプロジェクトを作成しますよね。

その時に、そのプロジェクトを格納するためのフォルダを指定させられると思います。
例えば、IntelliJの場合はこの画面です。

この時、WindowsとMacOSとで、大きな差が出てきます。
例えば、プロジェクトを格納するためのフォルダを今日の日付にしたいなと思い、「2019/09/14」という名前を付けようとしたとします。

しかし、Windowsを利用している方はこの時、この名前を付けることができないと気付くはずです。

というのも、Windowsでは、ある特定の記号をファイル名に利用することができないというルールが存在するのです。
試しに、/を入力しようとするとこのような表示が出てくるはずです。

なぜ、この記号が利用できないのかといいますと、細かい話は今回はしませんがこれらの記号は、システム内部で特殊な使われ方をしている記号です。

これらの記号をファイル名に用いられると、システム内部で誤作動が起きてしまう可能性があるんですね。

例えば、これはLinuxを使ったことがある人であればピンとくるかもしれませんが、「2019/09/14」と入力をすると、システム内部では「2019」フォルダの中の「09」フォルダの中の「14」フォルダという意味になってしまうのです。

入力されないのなら特に問題はないじゃないかとそう思うと思います。
確かに、はなから入力できないのであれば特に問題は起きません。
しかし、困ったことにMacOSではこの「/」をフォルダ名として利用できてしまうのです。

入力できるということは、MacOS内部には、この「/」をどうにかするための仕組みが用意されているのかもしれませんが、各ベンダーのソフトウェアについてはそうはいきません。

例えば、Mac版のIntelliJを利用していたとします。
そして、プロジェクトを格納するためのフォルダには「2019/09/14」という名前を付けました。
Macなのでこのフォルダ名に対してエラーは吐かれません。

Macを利用している人は試しにプログラムを書いて実行してみましょう。
どうですか?実行できましたか?

おそらくは、Mainクラスが見つかりませんという風なエラーが表示されたのではないかと思います。

これは、フォルダ自体は「2019/09/14」を指定しましたが、IntelliJ内部ではこれを「2019」フォルダ内の「09」フォルダ内の「14」フォルダ内のプロジェクトと認識してしまっているのです。

そんなフォルダは当然存在しませんから、プログラムが実行できるわけがないということです。

このエラーに関しては、ある程度OSの仕組みに詳しい人であれば、ピンとくるかもしれませんが、初学者の方が原因を見つけるのはなかなかに難易度が高いです。

このエラーの原理については、できれば理解していただきたいですが、よくわからない!という方は、フォルダ名には以下の記号を絶対に使わない!というのだけ気にしていただければ大丈夫です。

ポイント2:エスケープシーケンス ”\” について

Javaには、\と文字の直前に打ち込むと、その文字の意味を打ち消してただの文字としてあらわすことができる、エスケープシーケンスと呼ばれる機能が存在します。

例えば、” は、本来文字列を囲むという意味を持つ引用符ですが、\” とすることで、” という文字として扱うことができるようになるのです。

System.out.println(” ” “);

この書き方では、引用符を一回閉じてしまっているため、エラーが起きてしまいます。

System.out.println(“\””)とすることによって、”の意味を打ち消して、出力が可能になります!

と、ここまでがエスケープシーケンスについての解説ですが、ここは本題ではありません。

参考書などで勉強していると、たまにこのエスケープシーケンスがで表示されていることがあるのです。

しかし、このをIDEなどで入力をしてもエラーが出てしまう・・・

これは、¥マークが全角であることが原因です。
Javaでは、(Javaに限らずですが)基本的に全角文字は文字列指定でのみ使用が可能で、プログラムとして利用することは基本的に出来ません。

つまりこの¥マークも本来は半角である必要があるんですね。
でもこの¥マークを半角にすると\になってしまう・・・

ここが、システム的に少しややこしい点なのです。

Windowsなどで¥を半角で入力すると基本的にはこの円マークのまま半角になります。

しかし、Macなどでは、\となってしまうのです。

実は、この2つは全く同じ意味を持ちます。
半角の¥=\ です。

なので、\でも半角の¥でも特に変わりはないんだと思ってください。
※ちなみに特定のIDE環境では、気を利かせてWindowsでも\で表示してくれるようにしてくれています。

\に直すことで、無事エラーも消えました。

コラム

ところで、なぜ上記のようなことが起きてしまうのでしょうか?
プログラムにとって重要な記号なのであれば統一しておくべきだとは思いませんか?

実はこんな仕様になっているのは日本のWindowsだけで、海外のWindowsを使ってみると普通に\で表示されるんですよね。

これは日本のメモ帳ですが、フォントを欧文フォントにしています。

これには、昔、日本用の文字コードを策定する際に\を¥マークに割り当ててしまったことが原因となっているそうです。

なぜかというと、昔の文字コードは8bit、つまりはわずか254種類の文字だけが登録可能でした。

当時は、基本的には英語のみを利用するため、何とか足りていましたが、その国特有の記号というのはやはり出てきてしまうわけですね。

今回でいう¥マークは当然、円という通貨が存在する日本だけの記号です。

これを登録するために、何か一つ記号と取り換えなければなりませんでした。
そこで当時選ばれたのが\だったわけですね。

当時策定されたJIS X0201 コードです。 見ての通り\は存在せず、C6には¥があります。

今現在では、文字コードはUnicodeというどんな言語でも表すことができるコードに置き換わっているため、¥と\どちらも表現が可能となっていますが、なぜかWindowsでは、名残りとして\は半角の¥として表示されるようにしたままなんですね。

本来であれば、\が正しい形で¥は異常な形なので、できれば\で覚えましょう。

まだまだポイントはありそうですが、とりあえず思いつく限りは以上です。
他にまだ何かあれば、追記していきたいと思います。

Java自体のエラーではなくシステム自体の仕様なので、不具合というわけではないのですが、やる方からすると不具合みたいなものですよね。

こういったシステム内部の仕組みというのは、知っていて損することはないです。

例えば、Java以外のプログラムや、Linuxでの操作など役立つ場面はたくさん出てきます。
なので、ぜひとも覚えていってもらえるといいかなと思います。

この記事の著者

, 」カテゴリの記事