Java Basic クラスとは〜Step2_1〜

イントロダクション

Javaでの文法をちょっとやると「クラス」という言葉が出てきます。「インスタンス」とか、「オブジェクト」なんて言葉も一緒に出てきます。

インスタンスとは

クラス(ファイルに記述したもの)の「コンストラクタ」の処理を通った後に出来る、オブジェクト。

<例>

ホームページにログインするとインスタンスが1個作られます。→ログイン処理でユーザーをあらわすクラスのコンストラクタでDBから取得した情報を保持します。この保持するためのオブジェクトの事をインスタンスと呼びます。

オブジェクトとは

構造体、クラスの事。データをセットしたり、ゲットしたり、何かの処理を行ったりします。構造体はクラスと同じ様な意味です。細かい所は混乱するので省きます。

オブジェクトはインスタンス化出来る。→コンストラクタを通らなければオブジェクトで、通ればインスタンス。

<サンプルコード>

public class MyCls {
   //コンストラクタ
   public MyCls() {
   this.age = 3;
   }

   //フィールド変数
   private String name;
   private int age;
   //メソッド
   public void setName(String name) {
  this.name = name;
   }
}

カプセル化とは

上記の様にフィールドへのアクセス(name)にはクラスの外からアクセス出来なくする事→MyCls.name = “”;はエラーになる。

ちなみにフィールドをpublic String name;と書くと外部からアクセス出来る。→MyCls.name = “”;エラーにならない

クラスの構成のコメントをつけております。

サンプルはこちら

/** 外部の提供されているクラスをインポートする */
package jp.zenryoku.sample.cls;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* javaAPIの使い方
* @author takunoji
*/
// クラス定義
public class Step2_1 {
// フィールド変数:クラスの全てのメソッドからアクセスできる
private String FIELD_HENSU="クラスの外からはアクセスできません。";
public String FIELD_HENSU2="クラスの外からはアクセスできます。";

// メインメソッド(必ずこの書き方になる)
public static void main(String[] args) {
    Step2_1 step = new Step2_1();
    // 入力を受け取り切らない場合は次のStreamに読み込まれる
    //123456step.arrayTest1();
    step.arrayTest2();
}
// 自作のメソッド(メンバメソッドともいう)
public void arrayTest1() {
   System.out.println("test1 入力開始");
   // バイト型の配列をサイズ5で作成する
   byte[] moji = new byte[5];
 // エラーハンドル用のくくり
   try {
    // 標準入力から入力を受け取る
         System.in.read(moji);
   } catch(Exception e) {
         e.printStackTrace();
   }
 // 入力は「バイト型」のデータなのでString型(参照型)を生成する
   System.out.println("入力じた文字:" + new String(moji));
}

public void arrayTest2() {
    System.out.println("test2 入力開始");
    // 読み込み用のクラスを宣言する
    BufferedReader read;
  // InputSreamReaderからBufferedReaderを作成する
  // System.in→標準入力、読み込むために上のクラスでラッップ(包む)して
  // 使用する。ラップとは System.inをInputSreamReaderで包む(拡張)する
  // ことを言います。
    read = new BufferedReader(new InputStreamReader(System.in));
    String line = "";
    try {
     // BufferedReader.readLineメソッドで1行読む。
     // Fileなどを読み込む時にも使用する
           line = read.readLine();
    }catch(IOException e) {
            e.printStackTrace();
    }
         System.out.println("入力じた文字:" + line);
    }
}

「public class クラス名」全ての人がアクセスできるクラスですよ、と定義する
「private class クラス名」クラスの中からのみアクセスできるクラスと定義する

「public 返却値 メソッド名」クラスの外からもアクセスできるメソッド
「private 返却値 メソッド名」クラスの中からのみアクセスできるメソッド

フィールド変数に関して、今回は使用していません。

Systemクラスについて
標準入力、出力、Javaの強制終了などJavaシステムの
基盤的なアプリケーションの機能を実装している。

クラス 変数名 = new クラス名();という書き方では
メソッドを使用できません。→その様に実装しているからです。

このクラスにあるメソッドはスタティックメソッドと呼ばれます。
public static out; // フィールド変数です。
プログラム上では「System.out.println();」と使用してます。
Systemクラスのフィールドout(PrintSream)のメソッド
「println()」メソッドを使用して標準出力に文字を表示しています。
逆に、「in」は標準入力です。

スタティックメソッドはクラスをnewしないで直接
クラス名.メソッド名の形で呼び出します。



LWJGL Core dump〜エラーが出た時の対処〜

以下の様なエラーログが出た時
「A fatal error has been detected by the Java Runtime Environment:」
ulimit -c unlimitedのコマンドを打ってみてとエラーメッセージがあるので
Eclipseを起動する時にコマンドから実行する

【terminalより】
1. ulimit -c unlimitedを実行する
2. eclipseをコマンドより実行

これで改めて実行すれば実行できる

ただし、自分は他のエラーが出力された。。。



Java Basic try catch文 〜Step1_3_3〜

try catch文

入出力や様々なところでエラーハンドルを
行うために使用します。

実際には、どんな例外も受け取るExceptionクラスを使用しても良いのですが、個別に例外をキャッチするとエラーハンドルがやりやすいと思います。

try{処理}catch(例外の種類){エラー処理}のようにcatchの部分にキャッツする例外を記述します。

見やすくするとこんな感じ

スクリーンショット 2018-10-21 18.44.41.png

サンプルコードはこちら

例1: 標準入力を受け取るのに例外が投げられる可能性がある時

// try部分に例が発生するメソッド処理を記載するtry {

   System.in.read(b);

} catch(IOException e) {

   // 例外が起きた時にはキャッチ文ところで処理

   e.printStackTrace();

}

キャッチする例外を分けたい場合は
対応する例外クラスがJavaAPIにあるのでそれをキャッチするように
します。
例2: 例外を別々に受け取る

// 5バイト(5文字)分
byte[] b = new byte[5];

try {

   // 入出力の例外を投げる

   System.in.read(b);

  // 文字列を受け取る

  String result = new String(b);

  // 文字列に'a'が見つからない場合

 if (result.indexOf("a") == -1) {

     // 例外を投げる

    throw new Exception("入力違反です");
  }

} catch(IOException ie) {

   // 初めに標準入力の例外を受け取る様にする

   ie.printStackTrace();

} catch(Exception e) {

   // 自分で投げる例外をキャッチ
 
   e.printStackTrace();

}

ちなみに例外を扱う方法は他にもあって
メソッドで「例外をなげますよ」と指定する方法があります。

// Exceptionを投げる可能性があるメソッドを示す

public void testException() throws Exception {

  // 何かの処理

}

この時にはtry catch文は記載する必要がありませんが
このメソッドを呼び出す側がtry catchする必要があります。

そして、以下の様な場合はmainメソッドで例外を検知できません。

public static void main(String[] args) {

   testPrint();

}


/**

 * メインメソッドから直接(クラスをnew しないで)呼び出す時

 * はメソッドの修飾子に「static」をつける

 */

public static void testPrint() {

   try {

      throw new Exception("必ず例外を投げます");

   } catch(Exception e) {

     e.printStackTrace();

   }

}

呼び出し元に例外を検知させたくない場合に
上記の様な書き方を行います。

関連ページ

  1. 標準入力(コンソールからの入力)<System.inクラスについて>
  2. サンプル実装〜コンソールゲーム〜
  3. Java Basic インターフェース・抽象クラスの作り方
  4. Java Basic クラスとは〜Step2_1〜

 


Java Basic While文 〜 Step1_3_2〜

while文の書き方

1: while文の書き方

while(ループする条件) {
// 処理
}

2: 「ループする条件」について

例1

int i = 0;
while( i < 3) {
// 処理
}
上記の「i < 3」の部分が条件になり、日本語に訳すと
「iが3より小さい間」という意味になり
「while(i < 3)」は「iが3より小さい間ループする」
という意味になる。

「条件」部分(i < 3)に関して、真偽値(True, Flase)のページで解説しています。

例2

int i=0;
while(true) {
// 処理
}
例2の場合は条件の部分が「true」になっています。
条件の部分はtrueの間ループするので
→「i < 3」=> trueの場合が例1

例2の場合はずっとtrueなので「無限ループ」になります。
無限ループの場合、「break」文がないとPCが固まって
しまうので注意が必要です。

例3 do while文

int i = 0;
do {
// 処理
} while(i < 4);

条件が下の部分に来ています。

サンプルコードはこちら

 






Java Basic for文 〜Step1_3_1〜

イントロダクション

ひと通り、変数の扱いなど理解したら今度は、ループや条件分岐などを理解します。

ここら辺の文法を理解したらロジックを組むのが楽しくなると思います。

for文

いきなりですが、for文についてやります。※バグが入っております。それはどこでしょうか?

public static void main(String[] args) {
   // String型の配列を初期化
   String[] moji = {"abc", "def", "ghi"};
   // コンソール出力する変数
   String result = "";
   /* 【書き方】
    * for( 初期値; ループ条件; ループするときの処理) {
    *     // 何かの処理
        * }
    */
   for( int i = 0; i < 4; i++) {
      result += moji[i];
   }
   System.out.println("配列を繋げると: " + result);
}

初めにString型の配列を初期化しています。
ループして表示するために変数を用意しました。
そして、コンソール出力用の変数「result」
for文を開始いたします。

for文の文法

上記のソース部分にも記載しましたが、一応
1行大枠のみを記載すると以下のようになります。
for( .... ) { /* 処理 */}

「for(」に続き
「int i = 0」の部分では使用する変数を初期化しています。
「i < 4」はループ条件、「i」が4より小さいときループします。
「i++」はfor文の中上の「/* 処理 */」の部分を一周したら行う処理です。

一部分だけだとわかりづらいのでまとめます。
下のような処理があったとして。。。

サンプルコードと内訳

for( int i = 0; i < 4; i++) {
    System.out.println("Hello World=" + i);
}

int 型の変数「i」を0で初期化して「i」が4より小さい間
「Hello World」に「i」の値を付け足した文字を
コンソールに出力します。
1回目のループは、「i」が1なので「Hello World1」が表示され
2回目のループは、「i」が1なので「Hello World2」が表示される



となります。
そして、コンソール出力をした後に「i++」の処理が走ります。
「i++」→「i」をインクリメントする=「i」に1を追加する
→ i = i + 1;
それから、次のループ処理を行う。。。

ざっと、コードを書いてみました。こんな流れになります。
サンプルコードはここからダウンロードしてください。