Javaの大海原をじゃばじゃばと

勉強メモとか雑記です

勉強メモ@プロJava/その7

再帰とスタック & 第12章 入出力と例外

再帰 練習問題p.228
次のforループでの処理を再帰に書き換えてみましょう。
「プロになるJava」より gihyo.jp

for(inti=3;i>0;i){
System.out.println(i);
} 
public class RecursionExercise {
    static void loop(int i){
        if (i == 0){
            return;
        }
        System.out.println(i);
        i--;
        loop(i);
    }

▼コンソール

うむ!ここからは先は【第12章 入出力と例外】に突入や!

疑問メモ
少し調べてわからなければ後で調べることにして先に進む、1周目だから^^;
1.ポート番号は65535までの数字が使えるとのことだが、この数字なに?(p.243)
⇨16bit、つまり2バイトまで使えるということ。1023まで用途決まっているということだがこれは10bitまでは定員が埋まっているということ。
しかし1023も何に使われているのか?
⇨いくつか関連サイトを閲覧したが、こちらを読む読む

www.nic.ad.jp

ja.wikipedia.org

⇨どうして「未割り当て」とか「非公式」とかあるんや?てかなんで10bit分を「予約枠」にした?キリよく1バイトにすれば良かったんじゃ?
 これどういう順番で割り当ててる??
⇨学習優先度としてはまずこの「プロJava」を進めたい。沼にはまりそうなので、もう今は気にせず進める…

try-with-resources メモ
IntelliJ IDEA上で、例外が途中で発生しようが必ずcloseする必要があるものを作り出している箇所にカーソルを当てて「option + return」すると、
「try-with-resourcesで囲む」という選択肢が出てくる!

囲んでくれた!↓

try (Socket soc = server.accept()) {
            System.out.println("connect from " + soc.getInetAddress());
            InputStream input = soc.getInputStream();
            System.out.println(input.read());
            input.close();
            soc.close();
        }

「必ず閉じなければいけない」のは入力ストリームも同じなので、追加。

try (Socket soc = server.accept();
             InputStream input = soc.getInputStream()) {
            System.out.println("connect from " + soc.getInetAddress());
            System.out.println(input.read());
            input.close();
            soc.close();
        }

うむ!

練習問題p.248
SimpleServerを起動せずにSimpleClientを実行すると例外java.net.ConnectExceptionが発生します。例外処理をして「サーバーが起動していません」とメッセージを出すようにしてみましょう。

▼SimpleServer.java

package projava;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {
    public static void main(String[] args) throws IOException {
        var server = new ServerSocket(1600);
        System.out.println("Waiting...");

        try (Socket soc = server.accept();
             InputStream input = soc.getInputStream()) {
            System.out.println("connect from " + soc.getInetAddress());
            System.out.println(input.read());
        }
    }
}

▼SimpleClient.java(書き換え前)

package projava;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.Socket;

public class SimpleClient {
    public static void main(String[] args) throws IOException {
        try (var soc = new Socket("localhost", 1600);
             OutputStream output = soc.getOutputStream()) {
            output.write(234);
        }
    }
}

▼コンソール

▼SimpleClient.java(書き換え後)

package projava;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.Socket;

public class SimpleClient {
    public static void main(String[] args) throws IOException {
        try (var soc = new Socket("localhost", 1600);
             OutputStream output = soc.getOutputStream()) {
            output.write(234);
        }
        catch (ConnectException e){
            e.printStackTrace();
            System.out.println("サーバーが起動していません");
        }
    }
}

▼コンソール

うむ!!

ちなみに、macOSで「option + command + /」で、複数行まとめてコメントアウト&解除できるとな✨

qiita.com

ちょっとずつでも、これからも進めてこ〜
これから数日間は大自然と交流タームなので笑、またその後に更新する_φ( ̄ー ̄ )