Java基礎 – エンジニアの入り口 https://eng-entrance.com 「エンジニアの入り口」は、プログラミング入門やエンジニアリング入門の知識が満載の初心者のための勉強サイトです。プログラミングやサーバ、ネットワークの基礎知識や勉強方法を習得できます。 Fri, 14 Jun 2019 03:37:44 +0000 ja hourly 1 https://wordpress.org/?v=5.2.19 【初心者向け】Javaのメソッドとフィールドの基本まとめ https://eng-entrance.com/java-basic-method-field https://eng-entrance.com/java-basic-method-field#respond Wed, 31 May 2017 07:07:34 +0000 https://eng-entrance.com/?p=5846 JavaのメソッドとフィールドはJavaのクラスを使っていく上で必要不可欠な要素だ。

このページではメソッド・フィールドとは何かというお話と、使い方についてお伝えしていこう。

Javaのメソッドとフィールドとは?

クラスとはプログラムの設計図のようなものだ。

その設計図がどのような処理やデータを扱っているのかということを、メソッドとフィールドで書いてゆく必要がある。

メソッドとはクラスが持っている機能のことで、実際にプログラムが実行されるときに実行される内容が書かれている。

フィールドとはクラスが持っている情報のことで、そのクラスがどのような情報を扱うのかが書かれている。プロパティとも呼ばれることも多い。

スマートフォンを想像してみよう。スマートフォン本体をクラスだとすると、電話を掛ける、通信する、アプリを実行するという機能的なものはメソッドだと言える。そして端末名、電話番号、色、サイズなどのスマートフォンが持つ情報はフィールドだと言えるだろう。

メソッドとフィールドの書式

クラス内にどのようにメソッドとフィールドが定義されるかを見てみよう。

メソッドとフィールドの定義の流れ

クラスでは次のような流れでメソッドやフィールドが書かれる。

class クラス名(){
	フィールド1;
	フィールド2;
	フィールド3;
	...

	メソッド1{
	}
	メソッド2{
	}
	メソッド3{
	}
	...
}

メソッド定義の書式クラスを宣言のすぐ下に、クラスで使用するフィールドを定義してゆき、その下にメソッドを定義する流れだ。

メソッドは次の書式で書くことができる。

[アクセス修飾子] [戻り値の型] メソッド名(引数1,引数2,引数3...){
	(メソッドの処理内容)
}

戻り値の型とは、メソッドを実行したときにどのようなデータが返されるかということを定義する。文字列ならString型、数値ならint型などだ。何もデータを返さなない場合はvoid型を指定する。アクセス修飾子とはメソッドの公開範囲のことで、どのクラスからでも実行できるメソッドか、そのクラスの中でしか実行できないメソッドかといったことを設定できる。

 

メソッド名はどんな名前でも良いが、できるだけわかりやすい名前を付けるようにしよう。メソッド名を見て、どんな処理かがなんとなく想像できればいいだろう。

引数はメソッドを実行するときに渡される値のことだ。渡された値をもとに、メソッドの処理を行う時に定義する。

フィールド定義の書式

次に、フィールドの書式を見てみよう。

[アクセス修飾子] [データの型] 変数名;

データの型はフィールドがどんな型かを定義する。アクセス修飾子はメソッドで指定しているものと同じく、フィールドの公開範囲を定義する。

変数名はメソッド同様、わかりやすい名前を付けるようにしよう。

メソッドとフィールドのサンプル

それではサンプルプログラムを見てみよう。

サンプルプログラム

ファイル名: ClassSample.java

public class ClassSample {

	//フィールド
	String name;	//[1]
	String address;	//[2]

	//実行メソッド[3]
	public void exec(){
		init();					//[4]
	    name = "RecurrentTechnology";	//[6]
	    address = "東京";		//[7]
	    printMessage();	//[8]

	}
	//初期化メソッド[5]
	public void init(){
		name = "";		//[4]
		address = "";	//[5]
	}

	//メッセージ出力メソッド[9]
	private void printMessage(){
	    System.out.println(getMessage());	//[10]
	}
	//メッセージ設定メソッド[11]
	private String getMessage(){
		return "私は" + name + "です。" + address + "に住んでいます。";	//[12]
	}

}

実行結果

私はRecurrentTechnologyです。東京に住んでいます。

サンプルプログラムの解説

メソッドとフィールド説明をしながら解説してみよう。

  • [1]フィールド「name」が宣言されている。フィールドの型はString型で、フィールド名から名前を扱うフィールドであることが想像できる。
  • [2]フィールド「address」が宣言されている。フィールドの型はString型で、フィールド名から住所を扱うフィールドであることが想像できる。
  • [3]実行メソッドであるexecメソッドを定義している。execメソッドの戻り値の型はvoid型なので、実行されても何も結果を戻さないメソッドだということがわかる。
  • [4]実行メソッドであるexecメソッドが呼び出されると、まずinitメソッドが実行される。
  • [5]初期化メソッドであるinitメソッドを定義している。こちらもexecメソッドと同じく、戻り値の型はvoid型なので、ただ実行されるだけの処理結果を戻さないメソッドだ。
  • [5]initメソッドでフィールド「name」が初期化される。[6]同じくフィールド「address」が初期化される。
  • [7]execメソッド処理に戻り、フィールド「name」に名前が設定される。
  • [8]フィールド「address」に住所が設定される。
  • [9]メッセージ出力メソッドであるprintMessageを定義している。コンソールに文字を出力するメソッドだ。
  • [10]ここでメッセージが出力されるが、出力する前にメッセージ設定メソッドであるgetMessageを呼び出し、その結果をコンソールに出力している。
  • [11]メッセージ設定メソッドであるgetMessageを定義している。戻り値はStringクラスとなっており、文字列が返されることがわかる。
  • [12]名前と住所を文章にして、結果を呼び出し元メソッドであるprintMessageに戻している。

まとめ

このページではJavaクラスのメソッドとフィールドについてお伝えしてきた。

Javaプログラムを組む上で必ず理解しておく必要があることだ。参考にしていただければと思う。

]]>
https://eng-entrance.com/java-basic-method-field/feed 0
【しっかり押さえたい】Javaのmainメソッドとは?と使い方 https://eng-entrance.com/java-basic-main https://eng-entrance.com/java-basic-main#respond Tue, 30 May 2017 00:36:07 +0000 https://eng-entrance.com/?p=5842 Javaのmainメソッドとは、必ずはじめに実行されるJavaプログラムのメソッドのことだ。

何もわからないうちもなんとなく「void main」と打っていたと思うが、これもmainメソッドさえあればJavaプログラムは実行できるためだ。

このページではmainメソッドについてお伝えしよう。

mainメソッドとは?

Javaプログラムには最初に実行されるメソッドがある。それはmainメソッドと呼ばれるもので、プログラムの開始はすべてこのmainメソッドから開始される。次のサンプルプログラムを見てみよう。

public class ClassSample {
	  public static void main(String args[]){
		    System.out.println("Hello! World!");
		  }
}

Javaの入門書や初心者向けWebサイトでよく見かける「Hello!World!」という文字をコンソールに表示するだけのプログラムだが、このプログラムを見るとmainメソッドに書かれていることがわかる。 

このような短いプログラムでも、数多くのクラスで構成されているプログラムでも、Javaプログラムはこのmainメソッドから始まるということを覚えておこう。 

mainメソッドがないとどうなる?

プログラムにmainメソッドがないとどうなるのだろうか?次のサンプルプログラムを見てみよう。

public class ClassSample {
	  public static void start(String args[]){
		    System.out.println("Hello! World!");
		  }
}

mainの代わりにstartという名前を付けている。このプログラムの場合、コンパイルは成功するが、実行すると次のようなエラーが返される。 

java.lang.NoSuchMethodError: main
Exception in thread "main"

"java.lang.NoSuchMethodError:main"は「mainというメソッドがないためにエラーが発生している」という意味で、プログラムが最初に実行すべきmainメソッドを探したが、見つけられなかったために発生している。 

このように、Javaプログラムではmainメソッドがプログラムの入り口となって実行されるため、mainメソッドを正しく準備しておく必要があるのだ。

mainメソッドの書式

mainメソッド次のような書式で設定される。

public static void main(String args[]){

     (処理内容)

}

"public"とはアクセス修飾子のことで、プログラムの公開範囲を意味している。mainメソッドのアクセス修飾子はpublicでなければならない。"public"を省略したり、別のアクセス修飾子を指定したりすると実行できないので注意しよう。 

"static"とは「静的」という意味だ。詳しくはまた別の機会に説明するが、"static"なクラスは特別な宣言をしなくても実行することができる。

それでは、mainメソッドの引数に設定されている"args[]"とは何を意味するのだろうか。mainメソッドはプログラムの入り口となっていることは説明したが、"args[]"はプログラムが実行されるときに渡される情報を意味している。

これはコマンドラインでJavaプログラムを実行するとよくわかる。コマンドラインから前出のサンプルプログラム"SampleClass"を実行する場合、コマンドは次のようになる。

$ java SampleClass

通常はこのように実行するが、次のように引数を渡して実行することもできる。 

$ java SampleClass "SampleArg1" "SampleArg2"

この場合、"SampleArg1"、"SampleArg2"がSampleClassの実行時の引数として渡されているが、この引数がmainメソッドの引数"args[]"にあたる。

外部プログラムから連携する際など、引数を指定して実行するケースがあるが、そのような場合に使われているので覚えておこう。

まとめ

このページでは基礎的な知識としてJavaのmainメソッドについてお伝えしてきた。

Javaを触っていく上で必ず知っておきたい知識だ。参考にしていただければと思う。

]]>
https://eng-entrance.com/java-basic-main/feed 0
【1分でわかる】Javaでよく聞くRuntimeとは? https://eng-entrance.com/java-basic-runtime https://eng-entrance.com/java-basic-runtime#respond Wed, 17 May 2017 01:33:39 +0000 https://eng-entrance.com/?p=5683 ときどき聞くことがあるJavaのRuntimeとは、なんのことはない。実行中という意味になる。

このページではJavaのRuntimeについて簡単にお伝えした。

JavaのRuntimeとは?

JavaのRuntimeという単語の意味は「実行時」である。

このRuntimeという語はJavaのプログラムの実行中、つまりプログラムが始まってからから終わるまでの間を表している。

java-exe

プログラムのコードと対比して考えると,プログラム始まりはmainメソッドが呼び出されたときに始まる。そして,mainメソッドの終了とともに実行は終了する。

runtime

というわけで、難しい話じゃない。

Runtimeという言葉が出てくるのは、例えばJava Runtime Environment(JRE)という言葉の中だ。これはJava実行環境、つまりJavaプログラムを実行するために必要な環境という意味になる。

また、プログラムを実行したときに発生するエラーをruntimeエラーと呼ぶのもこの意味があるからだ。

では、Runtimeという言葉が使われているJREについても軽く言及しておく。

Runtimeに必要な環境JRE

Javaプログラムのruntimeに必要なJREと呼ばれるJava実行環境とはなんだろう。大きく分けて3つのものが必要である。

jre

  • Java virtual machine-プログラムを実行するJava仮想マシーン
  • runtime class libraries-プログラムで使われるクラスライブラリ
  • Java application launcher-アプリケーションを起動するランチャー

オラクル社(Javaの開発を行っている会社の名前)が提供している。

これらを、Javaを実行するためのシステムに配置して環境設定を行う。こうすることによって、Javaの起動、そして実行、実行時に必要なライブラリの全てが整う。

まとめ

このページではJavaのRuntimeについてお伝えをした。参考にしていただければ幸いだ。

]]>
https://eng-entrance.com/java-basic-runtime/feed 0
【初心者向け】Javaのプログラム内の空白と改行の扱いについて https://eng-entrance.com/java-basic-blank https://eng-entrance.com/java-basic-blank#respond Mon, 17 Apr 2017 00:35:55 +0000 http://eng-entrance.com/?p=5380 このページではJavaプログラム内での空白や改行の扱いについてまとめてお伝えした。

普段はなかなか意識をしないかもしれないが、考え方としては大切なので、把握はしておこう。

Javaの空白や改行

それでは早速、Javaの空白や改行の出力方法について確認していこう。

実行できないプログラムはどれか?

いきなりではあるが、クイズから始めてみることにしよう。

次のようなサンプルプログラムがある。

public class ClassSample {
    public static void main(String args[]){
        System.out.println("Hello! World!");
    }
}

 

コンソールに"Hello!World!"という文字をコンソールに出力するシンプルなプログラムだ。

このプログラムの書き方を変えて、以下の3種類のプログラムを作成してみた。このうち、実行できないプログラムはどのプログラムだろうか。

(1)文節ごとに改行のあるプログラム

public 
class 
	ClassSample {
	  public 
	  static 
	  void 
	  main
	  (String 
			  args[]){
		    System.
		    out.
		    println("Hello! World!");
		  }
}

(2)文の最初に空白がなく、ところどころ改行されているプログラム

public class ClassSample {
public static void 
main(String args[]){
System.
out.
println("Hello! World!");
}
}

(3)空白や改行がランダムに設定されているプログラム

public class ClassSample {
public static vo id main(String args[]){
		    Sys tem.out.pr
		    int
		    ln(
		    		"Hello! World!");
}
}

おわかりだろうか。正解は(3)になる。これら3種類のプログラムにおいて、実行できないのは(3)だけだ。

Javaの空白と改行の扱い

それでは(1)と(2)のプログラムが動作して、(3)のプログラムだけが動作しないのかを解説しよう。

(1)のプログラム

まず(1)のプログラムから見てみると、改行が多く、非常に読みづらいプログラムであることが見て取れる。しかしこのプログラムは正しく動作する。

なぜなら、Javaでは文節単位であれば、好きに改行を入れて書くことができるからだ。

Javaのソースプログラムを実行可能な形式に変換することを「コンパイル」と言い、その変換する処理を行うプログラムを「コンパイラ」と言うが、文節単位で改行が設定されていてもコンパイラはプログラムを理解できる。人間には読みづらくても、コンパイラは理解できるので問題はないのだ。

(2)のプログラム

それでは(2)のプログラムはどうだろう。(1)と同じく改行があり、文の空白もなく読みづらい印象を受けるが、この場合もコンパイラがプログラムを理解できるので問題ない。

(3)のプログラム

(3)の場合は文節の途中で空白や改行が設定されている。この場合は文節を理解することができないため、どのような命令が書かれているのかコンパイラが理解することができない。よって、コンパイルエラーとなって実行することができないのだ。

読みやすくする工夫が必要

空白や改行は文節単位であれば自由に設定することができるが、プログラムを書くのは人間である。そのため、人間が読みやすいプログラムを書くことが大切だ。

もう一度最初のサンプルプログラムを見てみよう。

public class ClassSample {
    public static void main(String args[]){
        System.out.println("Hello! World!");
    }
}

メソッドの前には空白を設定し、メソッドの処理内容を書く際には、さらに空白が挿入されて読みやすくなっている。文の最初に空白を設定して書くことを「インデント(字下げ)」と言うが、インデントをつけてコーディングすると読みやすいソースコードを書くことができる。

また、プログラムの1文が長すぎる場合、エディタを右にスクロールさせて読む必要がある。スクロール操作をしながらだと読みづらくなるため、場合によって改行を設定して、スクロールしなくても読めるようなプログラムを書くといいだろう。

まとめ

このページではJavaプログラム内の空白や改行についてまとめてお伝えしてきた。

普段深く考えることはないだろうが、把握しておくと役立つ場面があるだろう。

]]>
https://eng-entrance.com/java-basic-blank/feed 0
【初心者向け】Javaプログラムの実行方法とその仕組みとは? https://eng-entrance.com/java-basic-java https://eng-entrance.com/java-basic-java#respond Thu, 09 Feb 2017 23:49:57 +0000 http://eng-entrance.com/?p=4517 Javaのコンパイルが完了したら、続いて実行を行う。

コマンドプロンプトなどで、「java クラス名」とするとプログラムが実行されるというのが簡単な説明だ。

もう少し詳しく仕組みなども含めて確認しておこう。

Javaプログラムを実行する仕組み

Javaプログラムは、実行する前にコンパイラによって中間言語に翻訳される。

javac javaファイル名

というあれだ。

実行する時は、この中間言語をJava仮想マシン(JVM: Java Virtual Machine)が実行することになる。

Java仮想マシンは、実行時に中間言語を読み込んで翻訳し、異なるコンピュータの上で同じ処理をさせる。コンピュータによって同じ命令をコンピュータに実行させる言語が異なるからである。

javaのコンパイルと実行

Javaのコンパイル編で説明しているように、コンパイラによって中間言語はクラスファイル(拡張子:「.class」)に保存される。

コンパイルについては下記で説明している。また、この後も下記でコンパイルしたものを使うので読んでいない方は先に確認しておこう。

では、実際にこのクラスファイルを実行してみよう。

Javaコマンドによる実行

コマンドプロンプトからJavaコマンドを使って実行する方法は簡単だ。

java クラス名

これだけだ。

HelloWorldという名前のクラスを実行してみよう。最初にクラスファイルがあることを確認しておく。

dirコマンドで見てみると、次のようにHelloWorld.classという名前のクラスファイルがあることが確認できる。

ディレクトリ確認

次に、javacコマンドの引数にクラス名を指定して実行する。

javac

「Hello World!」の文字が表示されれば成功だ。

注意点として、もしクラス名を間違えたらどうなるかを見ておこう。「HelloWorld」と入力しなければならないところを、誤って「HellowWorld」と入力すると、次の画面が表示される。こんな表示が出たら、クラス名の大文字小文字を含めてよく確認しよう。

classnotfound

このような表記になる。

Javaプログラム実行の3ステップ

Step.1 Javaのコードを書く

Step2. 「javac Javaファイル名」でコンパイルする

Step3. 「java クラスファイル名」で実行する

この手順を理解しておこう。

まとめ

このページではJavaプログラムの実行方法についてお伝えした。コンパイルし、クラスファイル名をjavaコマンドで実行するというフローは必ず覚えておこう。

]]>
https://eng-entrance.com/java-basic-java/feed 0
【初心者でもわかる】Javaのコンパイルとは?とその方法 https://eng-entrance.com/java-basic-compile https://eng-entrance.com/java-basic-compile#comments Thu, 09 Feb 2017 00:47:09 +0000 http://eng-entrance.com/?p=4497 コンパイルとは、プログラムの翻訳作業のことだ。

Javaプログラムはプログラムを書いてすぐに実行をすることはできない。そのプログラムを機械がわかるように翻訳してはじめて、コンピュータが実行をしてくれる。

このページでは「コンパイルとは」のもう少し詳しい説明と、Javaのコンパイル方法についてまとめてご紹介しよう。

コンパイルとは?

コンパイルとコンパイラ

コンパイルとは、プログラム言語をコンピュータが理解できる言語に変換することだ。そのための翻訳ソフトウェアをコンパイラという。

ほとんどのコンパイラは、コンピュータが直接実行できるコンピュータ特有の言語に合わせ翻訳する。そして、それを直接実行する。

Javaだけ少し特殊

コンパイルが必要なプログラミング言語はたくさんあるが、その中でもJavaは特殊だ。

Javaは「どんな環境でも動く!」、Windowsだろうと、Macだろうと、Linuxだろうと他の何かだろうとひとつのプログラムで動くという信念で作られている。

そのため、特定のコンピュータが理解出来る機械語に翻訳するのではなくて、どのコンピュータでも使える中間言語というものを作成する。

下記のイメージだ。

javaのコンパイル

実行するときは、それぞれのコンピュータにインストールされたJavaの仮装マシンが機械語に翻訳して実行してくれる。

プログラムを実行するために2段の翻訳機があるようなものだ。日本語から中国語、ドイツ語に翻訳するのではなくて、必ず英語に翻訳してから他の言語に翻訳するイメージになる。

Javaのコンパイル方法

では、実際にJavaプログラムをコンパイルしてみよう。

ここでは、WindowsのDOS窓からコマンドによりJavaのコードをコンパイルすることを、前提として説明を行う。コンパイルするための環境のインストール方法は下記のURLを参考にできる。

Javaインストール:https://eng-entrance.com/category/java/java-install

Javaファイルを置くフォルダの作成

まずはJavaファイルを置くフォルダを作成しよう。作成場所はどこでもいいが、わかりやすいのでCドライブの直下などがいいだろう。

下記のように「JavaSample」というフォルダを作ってみる。

javasample

Javaのプログラムファイルを保存する

続いてテキストエディタを使用して、以下のプログラムを打ち込んでソースファイルを作成する。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

テキストエディタは何を使っても構わない。Windows標準のメモ帳でも大丈夫だ。

memo

このファイルを「HelloWorld.java」という名前をつけて先ほどのフォルダに保存する。

コマンドプロンプトを開く

ここからが少々難しい。コマンドプロンプトというものを開く。

メニューを開いてアクセサリを選択する。

アクセサリ

その中のコマンドプロンプトを選択する。

コマンドプロンプト

するとコマンドプロンプトが開く。

cmd

これがコマンドプロンプトと呼ばれる、コンピュータをコマンドで直接操作する画面だ。例えばファイルのコピーをしたり、フォルダを作成したりなどの作業を一通りこの画面で実施することができる。

Javaのコンパイル作業はここで行っていくことになる。はじめからコマンド操作のすべてを理解するのは難しいと思うので、まずはJavaコンパイルに必要なところだけ見ておこう。

Javaのコンパイル作業

まず、以下のcdコマンドをコマンドプロンプトに入力し、ファイルを保存したフォルダC:\JavaSampleに移動する。

cdとはChange directoryの略で、そのフォルダに移動しますよ、という意味だ。CドライブのJavaSampleフォルダに移動するという意味になる。

cd

移動したフォルダに保存したJavaのファイルがあるかをdirコマンドで確かめよう。

dir01

以下のコマンドを打ち込み、先ほどのソースファイルをコンパイルする。コンパイルのためのコマンドはjavacである。コマンドの入力の仕方は簡単だ。

javac  Javaのファイル名

実際に、JavaのファイルHelloWorld.javaをコンパイルするためのJavacコマンドを入力する。ソースファイルに誤りが無ければ、次のようになるはずだ。

javac

コンパイルの結果をdirコマンドで見てみよう。

dir

コンパイルに成功すると先ほどのフォルダに「HelloWorld.class」が作成されている。これでコンパイルは成功だ。

実行の仕方は次ページで紹介をしているので続きはそちらから確認しよう。

コンパイルエラー

先ほどは正常にコンパイルできた例を紹介したが、記述内容に誤りがあると、コンパイルを実行した段階でエラーが表示される。初心者にありがちなコンパイルエラーと対処方法を紹介する。

セミコロン「;」が不足

まず、コンパイルエラーの見方から説明しよう。

わざとエラーのあるプログラムをコンパイルしてみた。エラーを見つけると、コンパイラはエラー情報を表示する。

error01

そのエラー情報からエラーの原因を見つけることができる。次の図はその方法を示している。

エラーの説明

エラーの場所が、ファイル名→ファイルの先頭からの行数→エラーのカラム位置というようにエラーの場所がすぐに分かるようになっている。

エラーの理由も表示される。セミコロン「;」が不足しているために発生しているエラーだ。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World!")   ← セミコロン(「;」)が足りない
	}
}

Javaの記述ルールは、1つの命令ごとにセミコロン「;」をつける決まりだ。

ダブルクオーテーション「”」が不足

これは少々分かりにくいが、「Hello World」の文字列の終わりのダブルクオーテーション「”」が不足していると、こんなエラーが起きる。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World!);   ← World!の後に「"」がない
	}
}

コンパイル後にエラーが表示された画面を示す。

error02

2つ目のエラーに「エラー: ';'がありません」とあるが、これは最初のエラー(「”」で閉じられていないエラー)の為に、文字列の終わりが判断できず、結果として命令文の終わりが見つけられないことから起きているエラーだ。

全角空白文字

これも初心者は意外とハマりやすいエラーだ。このエラーは、本来「半角空白」文字を入れるべきところに、「全角空白」文字を入れてしまったことから発生している。

public □ class HelloWorld {		   ← publicの後に全角空白(□)
	public static void main(String[] args) {
		System.out.println("Hello World!")  
	}
}

コンパイル後にエラーが表示された画面を示す。

error03

初心者が書籍やWebで紹介されているソースコードを、そのまま打ち込んでいると意外と起こりやすい。見た目でも違いがわからないので、何故エラーなのかで頭を抱えてしまうことも珍しくない。

このエラーを回避するには、全角空白を視覚的に表現してくれるエディタを使うとよいだろう。

メモ帳で開いた例:

memo

視覚的に表現してくれるエディタの例(サクラエディタ):

sakura

このエディタで表示すると、3行目の「public」の後ろに全角の空白が入っていることがわかる。

ファイル名とクラス名が異なる

このエラーは、ソースファイルに記述されているクラス名が「HelloWorld」であるのに対し、ファイル名を「Hello.java」としたために発生している。

error04

Javaでは、一つのファイルに一つのクラスを記述し、ファイル名は「クラス名.java」とする決まりだ。

閉じ括弧「}」

このエラーが一番やっかいなエラーだ。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World!")  
	← 「}」がない
}

コンパイルし後にエラーが表示された画面を示す。

error05

この例は短いソースコードなので、とじ括弧「}」が不足していることがすぐわかるが、数十行のプログラムで、if(){}やfor(){}のような段落のとじ括弧が不足していると、非常にわかりづらい。

開始括弧{一つに対し、とじ括弧}一つが対応するが、二段三段と入れ子になっていると、別のとじ括弧と対応してしまい、結果として後のほうでとじ括弧が足りないという事態になる。そのため、エラーとして表示されている行番号の付近にとじ括弧が不足しているとは限らないからである。

まとめ

このページでは「コンパイルとは」と、Javaのコンパイル方法についてお伝えした。

コマンドプロンプトを使ったことがないと難しいと思うかもしれないが、気合を入れる必要はない。すぐに慣れるはずだ。

javac  Javaのファイル名

覚えておこう。

このファイルをどう実行していくのかなどは次の項目を確認していってほしい。

]]>
https://eng-entrance.com/java-basic-compile/feed 6
【初心者向け】よく出会うJavaのエラーと対策7選! https://eng-entrance.com/java-basic-error https://eng-entrance.com/java-basic-error#comments Thu, 13 Oct 2016 23:50:33 +0000 http://eng-entrance.com/?p=3037 プログラミング初心者にとってなかなか苦労するのが、エラーが出たときのバグ取りだろう。

Javaだとコンパイラでチェックをしてくれるが、そこで出てくるエラーも対処がわからないことが多いはずだ。

このページでは初心者の方がよく出会うJavaのエラーについてまとめてみた。参考にしていただければと思う。

Javaのエラー表示について

Javaプログラミングでよくあるエラーを紹介する前に、どのような書式でエラーが表示されるかを見ておこう。

まだ中身がわからない方も多いと思うので、参考程度に見ていただくだけでも十分だ。後で役に立つ。

たとえば、このようなプログラムを作ったとしよう。

package sample;
public class SampleClass {
	public static void main(String[] args) {
		setArray();
	}
	public static void setArray(){
		int list[] = new int[10]; 
		list[20] = 1;
	}
}

"main"メソッドから"setArray"メソッドを呼び出して、配列"list"に値を設定するものだ。 

このプログラムを実行すると、後でも紹介するエラーのひとつ"ArrayIndexOutOfBoundsException"が発生する。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 20
	at sample.SampleClass.setArray(SampleClass.java:8)
	at sample.SampleClass.main(SampleClass.java:4)

それでは、このエラー表示を読み解いてみよう。 

  • 1行目にはどのようなエラーが発生したかが表示される。この場合は"ArrayIndexOutOfBoundsException"だ。
  • 2行目の"at"以降には、どこでエラーが発生したのかが表示される。この場合はjavaの8行目だ。
  • 3行目以降も"at"が続き、どこでエラーが発生したのかが表示される。2行目は実際にエラーが発生した場所だが、3行目以降はエラーが発生したメソッドを呼び出した場所が表示される。

このプログラムでは"main"メソッドから"setArray()"メソッドを呼び出しているので2階層になっているが、実際のプログラムではもっと複雑な構成になることが多い。その場合、3行目以降に何行も呼び出しクラスが表示されることになる。

エラーの解析を行うには、この情報をもとに、どのような経緯でエラーが発生したクラスやメソッドが呼び出され、どのクラスやメソッドに問題があるかを解析する必要がある。 

なお、このようなエラー情報はスタックトレースと呼ばれ、Javaが実行時に使用する"スタック"というメモリー領域に記録される情報を表示している。

スタックトレースはデバッグには欠かせない、何かと役にたつ重要な情報なので覚えておこう。

Javaのエラーとその対策

それでは、代表的なエラーとその対策を紹介しよう。

java.lang.NullPointerException

エラー内容

このエラーはnullのオブジェクトに対してアクセスしようとしたときに発生する。プログラミング時に比較的発生しやすいエラーで、エンジニアの間では「ヌルポ」と呼ばれている。

サンプルプログラム

package sample;
public class SampleClass {
	public static void main(String[] args) {
		String buf = null;
		System.out.println("buf length is " + buf.length());
	}
}

実行結果 

Exception in thread "main" java.lang.NullPointerException
	at sample.SampleClass.main(SampleClass.java:5)

対策

  • インスタンスの生成や値の設定が正しく行われているかをチェックする。
  • オブジェクトがnullになってしまうタイミングをデバッグで確認する。
  • プログラムでオブジェクトがnullかどうかのチェックを行い、エラーの発生をできる限り回避する。

java.lang.ArrayIndexOutOfBoundsException

エラー内容

配列のインデックスとして存在しない要素を指定した場合に発生するエラーで、先ほどのエラーの例でも紹介した。配列のインデックスとして1~10のインデックスしかないところ、20のインデックスに値を設定しようとする場合などに発生する。

サンプルプログラムと実行結果は最初に紹介した例を参照してほしい。

対策

  • 正しい配列のインデックスを指定できているかチェックする。
  • 配列の設定を繰り返し処理で行っている場合、繰り返し回数などに問題がないかチェックする。

java.lang.NumberFormatException

エラー内容

このエラーは文字列の値を数値に変換(キャスト)しようとしたが、文字列に数値として正しくない値が設定されている場合に発生する。

サンプルプログラム

package sample;
public class SampleClass {
	public static void main(String[] args) {
		int intVal;
		intVal = Integer.valueOf("文字列をキャスト").intValue();
	}
}

実行結果

Exception in thread "main" java.lang.NumberFormatException: For input string: "文字列をキャスト"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.valueOf(Unknown Source)
	at sample.SampleClass.main(SampleClass.java:5)

対策

  • 文字列にアルファベットや記号など、数値以外の文字が設定されていないかチェックする。
  • 文字列に空白やnullが設定されていないかチェックする。
  • 文字列には数値が設定されているが、変換しようとしている数値型で扱える値の範囲をオーバーしていないかチェックする。

java.lang.ClassCastException

エラー内容

このエラーはあるクラスを変換できないクラスにキャストしようとした時に発生する。

サンプルプログラム

package sample;
import java.util.Date;
import java.util.HashMap;
public class SampleClass {
	public static void main(String[] args) {
		  HashMap map = new HashMap();
		  Date dt = new Date();
		  map.put("birthday", "2000/01/01");
		  
		  Date birthday = (Date)map.get("birthday");
		  System.out.println(birthday);
	}
}

実行結果

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
	at sample.SampleClass.main(SampleClass.java:10)

対策

  • 配列などに設定した値のクラスと、値を取り出す時にキャストしようとしている型が一致しているかをチェックする。
  • 継承関係のある2つのクラスで、サブクラスにスーパークラスをキャストしようとしていないかをチェックする。

java.lang.ArithmeticException

エラー内容

このエラーは数値の計算において、不正な算術処理が行われた場合に発生する。例えば数学的にあり得ない「ゼロ除算(10÷0 など)」が発生するとこのエラーが発生する。

サンプルプログラム

package sample;
public class SampleClass {
	public static void main(String[] args) {
		int valueA;
		int valueB;
		int result;

		valueA = 100;
		valueB = 0;
		result = valueA / valueB;
	}
}

実行結果

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at sample.SampleClass.main(SampleClass.java:10)

対策

  • ゼロ除算が行われてないかをチェックする。
  • 数値型変数で計算している場合、割る数の変数にゼロが設定されていないかチェックする。

java.lang.NoClassDefFoundError

エラー内容

メソッドを呼び出す時や、インスタンスを生成しようとしている時に、Javaがクラス定義を読み込むことができないエラーだ。

対策

  • 環境変数CLASSPATHが誤っている可能性があるのでチェックする。
  • ファイル名やパッケージ名に誤りがないかチェックする。
  • プログラムに必要な外部ファイル(jar)が読み込まれているかチェックする。

java.lang.OutOfMemoryError

エラー内容

Javaは実行時にスタック領域とヒープ領域という2つのメモリー領域を使用するが、このエラーはプログラムの実行に必要なヒープ領域のメモリーサイズが不足した時に発生する。

ヒープ領域とはクラスやメソッドの定義など、オブジェクトのインスタンスが割り当てられるメモリー領域のことだ。

対策

  • プログラム内で無限ループになっていしまっている箇所がないかチェックする。
  • 一度に大量のデータを処理しようとしている箇所がないかチェックする。
  • 不必要にスコープ(公開範囲)が広いメソッドや変数を多用していないかチェックする。

このエラーの場合、環境によってはJVM(Java仮想マシン)のヒープ領域のメモリーサイズをチェックし、必要な場合はチューニングすることが可能だ。ただし、チューニングすることで別のアプリケーションのメモリーが不足するケースなどもあるので、注意が必要だ。

JVMのヒープ領域のチューニングについては、別の機会で紹介することにする。

まとめ

このページでは初心者の方がよく捕まるJavaのエラーについてまとめてきた。

ここの辺りのエラーを対処できれば、概ねプログラミングするときに困ることがなくなるはずだ。ぜひ参考にしていただければと思う。

]]>
https://eng-entrance.com/java-basic-error/feed 6
【1分でわかる】Javaのコメントの書き方 https://eng-entrance.com/java-basic-comment https://eng-entrance.com/java-basic-comment#respond Thu, 13 Oct 2016 00:18:35 +0000 http://eng-entrance.com/?p=3033 プログラムにメモを書いておきたいとき、「コメント」と呼ばれる機能を使う。コメントの部分は、プログラムには関係ないただの文字になる。出力もされない。

Javaにももちろんコメント機能は用意されていて、1行の場合「//」を、複数行の場合「/*」と「*/」で囲めばコメントとして扱われることになる。

これで知識としては十分だが、このページではコメントについて詳しくご紹介する。参考にしていただければと思う。

コメントとは?

Javaに限らず、プログラムにはコメントを書くことができる。コメントとはプログラムソースに記述されているが、実行対象にはならない箇所のことだ。

使い方は大きく分けて2通りある。

  1. プログラムに関してのメモ書きを置いておく
  2. バグを取るなどのために、一部分をプログラムとして動かなくする

前者は、他の人や将来の自分が見てわかりやすくするために、プログラムの内容やなぜそのように書いたのかを書いておくために使う。

後者は、バグを取るなどのためなどによく使う。コメント化して処理させないようにすることを「コメントアウト」と言うので、この言葉も覚えておこう。

コメントについては下記で詳しく解説している。

コメントの種類と書式

コメントする方法は2種類ある。1行だけのコメントを書く方法と、複数行のコメントを書く方法だ。

1行コメントの書式

1行だけのコメントは次のように書くことができる。

// (コメント内容)

スラッシュ記号を2つ書くことで、その行をコメントにすることができる。それでは、この方法を使ったコメント化の方法をサンプルプログラムで見てみよう。

サンプルプログラム

public class ClassSample {
	  public static void main(String args[]){
		    System.out.println("Hello! I'm RecurrentTechnology");
		    System.out.println("Nice to meet you!");
		  }
}

実行結果 

Hello! I'm RecurrentTechnology
Nice to meet you!

2行の文字列を出力する簡単なプログラムだ。このプログラムの1行目の文字列出力する箇所をコメントアウトしてみよう。 

サンプルプログラム

public class ClassSample {
	  public static void main(String args[]){
		    //System.out.println("Hello! I'm RecurrentTechnology");
		    System.out.println("Nice to meet you!");
		  }
}

実行結果 

Nice to meet you!

1行目がコメントアウトされたので、出力されなくなったことがわかる。 

複数行コメントの書式

次に、複数行のコメントの方法を見てみよう。複数行のコメントは次のように書くことができる。

/*
コメント内容
*/

/* ~ */で囲んだ部分がコメントとなる。「/*」がコメントの開始で、「*/」がコメントの終了という意味だ。

それでは、先ほどのサンプルプログラムをこの方法でコメント化してみよう。

サンプルプログラム

public class ClassSample {
	  public static void main(String args[]){
		    System.out.println("Hello! I'm RecurrentTechnology");
		    /*
		    System.out.println("Nice to meet you!");
		    */
		  }
}

実行結果

Hello! I'm RecurrentTechnology

文字列出力の2行目をこの方法でコメントアウトしてみると、2行目が出力されなくなったのがわかる。

この方法は複数行をまとめてコメントにすることができるので便利ではあるが、本来コメントアウトしてはいけない箇所もコメントにしてしまうといったミスを生んでしまうこともある。

public class ClassSample {
	  public static void main(String args[]){
		    System.out.println("Hello! I'm RecurrentTechnology");
		    /*
		    System.out.println("Nice to meet you!");
		  }
		    */
}

このサンプルプログラムの例を見てほしい。2行目の文字列出力をコメントアウトしようとしているのだが、コメントの終わり「*/」を記載する場所を誤っているのがわかる。

このような簡単なプログラムの場合は間違ってしまうことは少ないが、複雑な条件式の入り組んだプログラムなどをコメントアウトする際などに誤ってしまうケースもあるので、注意するようにしよう。

コメントの有用性

コメントはプログラム実行時には処理されないので、書く必要がないのでは?と思うかもしれないが、コメントを書くことでプログラムの可読性(読みやすさ)を高めることができる。

簡単な例を見てみよう。

public class ClassSampleCalc {
	  public static void main(String args[]){
		  int a;
		  int b;
		  a = 0;
		  b = 0;
		  for(int i = 1;i <= 10; i++){
			  a += i;
			  b -= i;
		  }
		  System.out.println("result(max) : " + Math.max(a, b));
		  System.out.println("result(min) : " + Math.min(a, b));
	  }
}

Javaを学び始めた初心者でも、ぱっと見てみてなんとなくは理解できるプログラムだ。

しかし、コメントを書くことで、より早い時間でプログラムの内容を理解することができる。先ほどのサンプルプログラムにコメントを記載してみよう。

/*
 * クラス名:ClassSampleCalc
 * 作成日:2016/08/08
 * 作成者:RecurrentTechnology
 * 修正日:
 * 修正者:
 * ver:1.0.0
 */
public class ClassSampleCalc {
	  public static void main(String args[]){
		  int a;
		  int b;

		  //変数初期化
		  a = 0;
		  b = 0;

		  //aとbの加減算処理
		  for(int i = 1;i <= 10; i++){
			  a += i;	//aにiを加算する
			  b -= i;	//bにiを減算する
		  }
		  //aとbのうち、大きい方の数を出力
		  System.out.println("result(max) : " + Math.max(a, b));

		  //aとbのうち、小さい方の数を出力
		  System.out.println("result(min) : " + Math.min(a, b));
	  }
}

このように、コメントで処理内容を記載することで、処理内容を理解しやすくすることができる。プログラムは作成した本人だけ理解できればいいだけでなく、他のエンジニアにも理解しやすいプログラムでなければならない。コメントは他のエンジニアがプログラムを理解する手助けにもなるのだ。

また、クラスの最初に作成日や作成者、バージョンなどの情報を書くことで、クラスファイル自体の履歴を把握することができる。

プログラムの内容そのものも、もちろん大切ではあるが、コメントも大切であることを覚えておこう。

まとめ

このページではJavaのコメントについてまとめてご紹介してきた。「//」と「/* */」を使えばコメントにすることができる。

//は1行ずつのチェックや行ごとのプログラムの説明に、「/**/」は一括で大きめにデバッグしたいときや行頭でプログラムの説明を書くのに向いている。

使いこなして、見やすいプログラムを実現しよう。

]]>
https://eng-entrance.com/java-basic-comment/feed 0
【超初心者向け】はじめてのJavaプログラム:パーツをまずは解説 https://eng-entrance.com/java-basic-first https://eng-entrance.com/java-basic-first#comments Sun, 09 Oct 2016 04:59:20 +0000 http://eng-entrance.com/?p=2961 このページでははじめてのJavaプログラムと称して、Javaプログラムを実際に作っていく。

はじめは簡単で、ほとんど何もできないプログラムだが、一歩一歩見て行こう。

Javaのサンプルプログラム

Javaをはじめとするオブジェクト指向プログラミング言語では「クラス(Class)」を作ることでシステムが構築されている。

オブジェクト指向とは? は後でじっくりやっていくので、気にしなくていい。これを書かないとはじまらないものだと思っておこう。

サンプルと解説

それではこのサンプルを見ながら、Javaのクラスの基本を学んでいこう。HelloJava.javaというファイルを下記のように作ってみて欲しい。

ファイル名: HelloJava.java

class HelloJava {
	public static void main(String args[]){
		System.out.println("Hello! I'm RecurrentTechnology");
	}
} 

HelloJava.javaと拡張子をつけて保存する。

コマンドプロンプトで、

> javac HelloJava.java

これでコンパイルができて、実行ファイルが出来上がるので、次のように実行する。

> java HelloJava

実行するとコンソールに「Hello! I'm RecurrentTechnology!」という文字を出力するという、非常にシンプルなプログラムだ。

Javaプログラムの書式

基本的にJavaのプログラミングは次の書式になる。

class ファイル名(クラス名){
   public static void main(String[] args){
    (処理内容)
  } 
}

System.out.println("Hello! I'm RecurrentTechnology");

の部分は、("ここを出力する")という意味になる。今後も使い続けるので、そういうおまじないだと思って、はじめは覚えてしまおう。

こういう形になるとだけ覚えてしまえば、とりあえず先に進むことができる。続きは下記から確認して欲しい。

詳しく知りたいという人もいると思うので、下記で解説する。

class

Javaはオブジェクト指向言語なので、すべてのプログラムは部品(モノ)単位で記述する。オブジェクト指向については下記ページで詳しく伝えているが、確認するのは当分先でいい。

classの範囲は、{ } で囲む。この範囲をブロックと言うが、1行目から5行目までがclassの範囲だ。

mainメソッド

モノが持っている機能は、メソッド(モノを操作する方法)という単位で作成する。ここではmainメソッドと言われる特別なメソッドを作っている。下記の部分だ。

public static void main(String args[]){

複雑で長いが、とりあえずここの中が実行されると思っておけばいい。

System.out.println( )命令

画面に任意のメッセージを表示するには、このように書けばいい。

ここではSystem(Javaが動作している環境)と言う部品(モノ)の中に、outと言うもの(画面を表す)があり、その画面のprintlnという機能(メソッド)を使ってメッセージを表示していると考える。

こちらも今後詳しく説明していくが、モノの中にある部品やメソッドは、ドット(.)を使って表す。

println()の( )の中に、表示させたい任意のメッセージを、ダブルクォーテーション「”」で囲んで渡している。「”」で囲まれた部分が文字列だ。

1つの命令を記述したときは、必ずセミコロン「;」を入れて、命令の終わりであることを明示している。mainメソッドのブロックには、複数の命令が記述できます。命令は上から順番に一つずつ実行されます。

public static void main(String[ ] args) {
  System.out.println("Javaの世界へようこそ");
  System.out.println("がんばりましょう!");
}

printlnのlnはLinefeedの意味で、出力後改行する、という意味だ。lnがなかったら改行されないが、同じように使える。

Javaプログラムの注意点

ファイル名とクラス名を同じ名前にする

すでに気づいたかも知れないが、サンプルのファイル名とクラス名は同じ名前になっている。これはファイル名とクラス名は同じにしなければいけないというJavaの決まりごとがあるからだ。

厳密に言うと、違くてもOKな場合もあるのだが、クラス名とファイル名が一致するとクラスの管理が行いやすいので、基本的にはこのルールに則るといいだろう。

大文字、小文字を意識する

また、Javaでは大文字、小文字を認識するため、「classsample」と「ClassSample」は違うものとして扱われるので注意しよう。 

まとめ

このページでは「はじめてのJava」と題して、サンプルプログラムを元にJavaの基本的な構成要素についてお伝えしてきた。

はじめてなので、わかりにくい部分もあったかもしれないが、徐々に慣れていくはずだ。それを楽しみにして、順々に階段を登ってほしい。

]]>
https://eng-entrance.com/java-basic-first/feed 2