例外
例外=エラーのこと。
try{
FileWriter fw = new FileWriter("test.txt");
fw.write("abc");
fw.close();
} catch( IOException e ){
System.out.println("書き込みエラー");
}
上の例はFileWriterクラスを使ってファイルに書き込む処理を行う。このとき、ファイルに書き込めないときなどにエラー(例外)が発生する可能性がある。例外が発生したときのエラー処理を行う部分をcatchに書く。catchの()内には例外の種類(IOException)を書く。
finally
例外が発生してもしなくても処理したいものをfinallyに書く。
try{
FileWriter fw = new FileWriter("test.txt");
fw.write("abc");
fw.close();
} catch( IOException e ){
System.out.println("書き込みエラー");
}finally{
System.out.println("終了");
}
自動的なclose
try直後の()内にオブジェクト生成文を書くことで、正常時も例外発生時も自動的なcloseが出来る。
try (FileWriter fw = new FileWriter("test.txt") ){
fw.write("abc");
// fw.close(); 不要
} catch( IOException e ){
System.out.println("書き込みエラー");
}
try~catchしない場合
例外が発生する可能性があるにもかかわらず、try~catchをしない場合、メソッドの引数の横に「throws 例外名」と書いてこのメソッドでその例外が発生することを示す。
void test() throws IOException{
FileWriter fw = new FileWriter("test.txt");
fw.write("abc");
fw.close();
}
例外処理しなくても良い例外
RuntimeExceptionを継承した例外は例外が発生する可能性があっても例外処理(try~catchやthrows)をしなくてよい。以下のような例外である。
- ArithmeticException 数学的なエラー(整数の0による除算など)
- ArrayIndexOutOfBoundsException 配列の範囲外の添え字
- NullPointerException オブジェクトにアクセスしたが中身が入っていない
- NumberFormatException 文字列の数値への変換に失敗(Integer.parseIntなど)
例外を発生させる
例外を発生させるには throw命令(throwsではない)
void test(num) {
if( num == -1 ){
throw new ArithmeticException("エラー");
}
・・
}
final
- final クラス・・継承できない
- final メソッド・・オーバーライドできない
- final 変数・・変更できない(定数)
スレッド
- スレッドは Thread クラスを継承するか Runnable インタフェースを実装する。
- スレッドを開始するには start
- スレッドの処理内容は run メソッドに書く。
- スレッドを一時停止するには sleep
- スレッドの強制停止は stop(非推奨)
- スレッドの同期は synchronized を指定する。メソッド・ブロックどちらにも指定可能。(synchronizedの例)
// Threadクラス継承例
class Sample extneds Thread
{
private String name;
public void run() {
for(int i=0;i < 5;++i){
System.out.println("処理中");
}
}
}
// 上のクラスのスレッドを開始
Sample s = new Sample();
s.start();
// Runnable インタフェース実装例
class Sample implements Runnable
{
private String name;
public void run() {
for(int i=0;i < 5;++i){
System.out.println("処理中");
}
}
}
// 上のクラスのスレッドを開始
Sample s = new Sample();
Thread th1 = new Thread(s);
th1.start();
Objectクラス
全てのクラスのスーパークラス
主なメソッド
- toString 文字列化するときに呼ばれる
- equals 比較するときに呼ばれる
toStringの例
class Sample
{
public String toString(){
return "abc";
}
}
// 文字列化時
Sample s = new Sample();
System.out.println(s); // abcと表示
文字列の比較(equals)
String str1 = "abc";
String str2 = System.console().readLine(); // abcと入力してみる
if( str1 == str2 ){
System.out.println("同じ");
}else{
System.out.println("違う"); // 違うと表示される
}
if( str1.equals(str2) ){
System.out.println("同じ"); // 同じと表示される
}else{
System.out.println("違う");
}
thisとsuper
- this:自クラスのオブジェクトを示す。
- this():自クラスのコンストラクタを示す。
class Sample
{
int num=1;
Sample(){
System.out.println("abc");
this(10); // 下のコンストラクタが呼ばれ10と表示
}
Sample(int num){
System.out.println(num);
}
void func(){
System.out.println(this.num); // 1と表示
System.out.println(num); // 1と表示(thisは省略できる)
int num = 2; // 別のnumを作成
System.out.println(this.num); // 1と表示
System.out.println(num); // 2と表示(thisを書かないと近い方を表示)
}
}
- super:スーパークラスを示す。
- super():スーパークラスのコンストラクタを示す。
class Sample2 extends Sample // 上のクラスを継承
{
Sample2(){
super(10); // Sampleのコンストラクタが呼ばれ10と表示
}
void func(){
super.func(); // Sampleのfuncが実行
}
}
コマンドライン引数
実行時に空白で区切って指定。mainメソッドの引数。
実行の例
java Sample りんご いちご みかん
class Sample
{
public static void main(String[] args)
{
System.out.println(args[0]); // りんご
System.out.println(args[1]); // みかん
System.out.println(args[2]); // いちご
}
}
args.length
通常の配列同様、lengthで何個入っているか分かる。これにより、コマンドラインで正しく指定されたかをチェックする。
※ファイル名を必ず1つ指定する例
java Sample test.txt
class Sample
{
public static void main(String[] args)
{
if( args.length != 1 ){
System.out.println("エラー");
return;
}
}
}
enum
enum(列挙型)とは、定数の集合のこと。カテゴリやトランプのマークなどあらかじめ数が決まっている何パターンかを表したい場合に用いる。
構文
enum 列挙型名 {
列挙子,列挙子,列挙子;
}
例:商品を分類するコードを導入
enum Category {
FRUITS,BOOK,DRINK;
}
enum の使用
enum はその名前の型の変数があるかのように使う。値は 型名.列挙子 しか入れることは出来ない。
Category type; type = Category.FRUITS;
enum の判定
if( type == Category.FRUITS){
System.out.println("果物です");
}
//ただしswitch 文では型名を書かなくて良い。
switch( type ){
case FRUITS:
System.out.println("果物です");
break;
case BOOK:
System.out.println("本です");
break;
case DRINK:
System.out.println("飲み物です");
break;
}
画面に表示(文字列化)
そのまま画面に表示すると列挙子が表示される。
System.out.println(type); // FRUITS と表示
この表示を変えるにはenum 内でtoString を作る。このときname()で列挙子を文字列で参照できる。
enum Category {
FRUITS,BOOK,DRINK;
public String toString(){
return "種類:" + name();
}
}
値の割り当て
各列挙子に値を割り当てることが出来る。このとき、値はそのenum のコンストラクタで受け取る。
enum Category {
FRUITS(1),BOOK(2),DRINK(3);
private int num;
private Category(int n){
num = n;
}
public int getNum(){
return num;
}
}
例:
Category type;
type = Category.FRUITS;
System.out.println(type.getNum()); //1が表示される。