例外=実行時エラーのこと。
try{
FileWriter fw = new FileWriter("test.txt");
fw.write("abc");
fw.close();
} catch( IOException e ){
System.out.println("書き込みエラー:" + e.getMessage());
}
上の例はFileWriterクラスを使ってファイルに書き込む処理を行う。このとき、ファイルに書き込めないときなどに実行時エラー(例外)が発生する可能性がある。例外が発生したときのエラー処理を行う部分をcatchに書く。catchの()内には例外の種類(IOException)を書く。
例外が発生してもしなくても処理したいものをfinallyに書く。
try {
int n = 8 / 0;
} catch (ArithmeticException e) {
System.out.println("エラー");
} finally {
System.out.println("終了します");
}
try直後の()内にオブジェクト生成文を書くことで、正常時も例外発生時も自動的なcloseが出来る。
try (FileWriter fw = new FileWriter("test.txt") ){
fw.write("abc");
// fw.close(); 不要
} catch( IOException e ){
System.out.println("書き込みエラー:" + e.getMessage());
}
例外が発生する可能性があるにもかかわらず、try~catchをしない場合、メソッドの引数の横に「throws 例外名」と書いてこのメソッドでは例外処理をせず、呼び出し元で例外処理をすることを示す。
void test() throws IOException{
FileWriter fw = new FileWriter("test.txt");
fw.write("abc");
fw.close();
}
例外を発生させるには throw命令(throwsではない)
void test(int num) {
if( num == -1 ){
throw new ArithmeticException("エラー");
}
・・
}
例外発生の可能性がある場合、通常は例外処理は必ずしなくてはならないが、RuntimeExceptionとそれを継承した例外は例外処理(try~catchやthrows)をしなくてよい。
全てのクラスのスーパークラス
class Sample
{
public String toString(){
return "abc";
}
}
// 文字列化時
Sample s = new Sample();
System.out.println(s); // abcと表示
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("違う");
}
class Sample
{
int num=1;
Sample(int num){
System.out.println(num);
}
Sample(){
this(10); // 上のコンストラクタが呼ばれ10と表示
}
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を書かないと近い方を表示)
}
}
class Sample2 extends Sample // 上のクラスを継承
{
Sample2(){
super(10); // Sampleのコンストラクタが呼ばれ10と表示
}
void func(){
super.func(); // Sampleのfuncが実行
}
}
実行時に空白で区切って指定。mainメソッドの引数。
Eclipseでは、Javaファイルを右クリックし、[実行]-[実行の構成]で「引数」の「プログラムの引数」に1行1つで指定する。
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]); // みかん
}
}
通常の配列同様、lengthで何個入っているか分かる。これにより、コマンドラインで正しく指定されたかをチェックする。
※ファイル名を必ず1つ指定する例
java Sample test.txt
class Sample
{
public static void main(String[] args)
{
if( args.length != 1 ){
System.out.println("エラー");
return;
}
}
}
// Threadクラス継承例
class Sample extends 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();
enum(列挙型)とは、定数の集合のこと。カテゴリやトランプのマークなどあらかじめ数が決まっている何パターンかを表したい場合に用いる。
enum 列挙型名 {
列挙子,列挙子,列挙子;
}
例:商品を分類するコードを導入
enum Category {
FRUITS,BOOK,DRINK;
}
enum はその名前の型の変数があるかのように使う。値は 型名.列挙子 しか入れることは出来ない。
Category type; type = Category.FRUITS;
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が表示される。
Optionalは、オブジェクトが存在しない場合がありえる値を表す。nullを返す代わりに使用する。Spring Boot DATA JPAでは、データベースを主キーで検索するfindByIdを使用した場合の戻り値の型。
| get() | オブジェクトを取得できる。存在しない場合、例外NoSuchElementException が起きる。 |
| isPresent() | 存在する場合、true返す |
| orElse(値) | 存在する場合、オブジェクトを取得。存在しない場合、値を返す |
| orElseGet(()-> 式 ) | 存在する場合、オブジェクトを取得。存在しない場合、式の値を返す(存在しない場合しか式は評価されない) |
| orElseThrow(()-> 例外) | 存在する場合、オブジェクトを取得。存在しない場合、例外を返す |
// 例外でエラー処理する例
try {
Shouhin s = repository.findById(sid).get();
model.addAttribute("shouhin",s);
}catch(NoSuchElementException e) {
return "err";
}
// isPresentで判定する例
Optional<Shouhin> s = repository.findById(sid);
if( s.isPresent()) {
model.addAttribute("shouhin",s.get());
}else {
return "err";
}
// orElseで存在しないときにnullを入れて判定する例
Shouhin s = repository.findById(sid).orElse(null);
if( s == null) {
return "err";
}
model.addAttribute("shouhin",s);