プログラミング自主学習 DAY60 Module/Exception
Module
可動性(exportsをしない場合)
プログラムが「モジュールa」のパッケージ1,パッケージ2が必要であり、「モジュールb」のパッケージ3 が必要とする。しかし、機能的にパッケージ2が修正が多いとすれば、いちいちプログラムを修正しなければならない。
そのため、パッケージ1のみexportし、同じモジュールa所属のパッケージBはexportしない。
そうすれば、プログラムからパッケージ2を直接参照することはできないが、
同じモジュール内のパッケージ1から2をimportし、必要によって、使用すれば、プログラムでもrequireをわざと修正せずにより柔軟に使用することができ、依存関係をゆるくなるため、自由度が上がる。
<module a>
module my_module_a {
exports pack1;
//exports pack2;
}
package pack1;
import pack2.B1;
public class A {
//field
//constructor
//method
public void method() {
System.out.println("A-method");
B1 b = new B1();
b.method();
}
}
<program>
package app;
import pack1.A;
//import pack2.B;
import pack3.C;
public class Main {
public static void main(String[] args) {
A a = new A();
a.method();
//B b = new B();
//b.method();
C c = new C();
c.method();
}
}
A-method
B-method
C-method
パッケージ1のBを隠しても、同じモジュールaのパッケージからimportするため、パッケージ1.Bも使用できる。
transitive
この場合は、application_2はmodule bの機能を使えない。
そのため、transtive
を依存するmoduleに付けて依存するmoduleが依存するmoduleを使用することもできる。
module_my_application_2 {
requires my_module_a;
}
module_my_module a{
exports pack1;
requires transitive my_module_b;
}
my_module_aのbuild path
➡project
➡ modulepath
にmy_module_bを追加し、コードを修正する。
package pack1;
import pack2.B1;
import pack3.C; //依存関係であるため、importができるようになった。
public class A {
//field
//constructor
//method
public void method() {
System.out.println("A-method");
B1 b = new B1();
b.method();
}
public C getC() { //Cをリターンするメソッドを宣言する。
C c = new C();
return c;
}
}
package app;
import pack1.A;
//import pack2.B;
import pack3.C;
public class Main {
public static void main(String[] args) {
A a = new A();
a.method();
//B b = new B();
//b.method();
C c = new C();
c.method();
C result = a.getC();
result.method();
}
}
A-method
B-method
C-method
C-method
my_application_2より、my_modules_bをrequiresしなくても、依存しているaがbをtransitive requiresしているため、my_application_2でもmy_modules_bを使用することができる。
module my_module {
requires transitive my_module_a;
requires transitive my_module_b;
}
また、このように、集合モジュールを作成することもできる。
Reflection
Reflectionとは、実行途中にタイプ(class,interface)を検査し、どのようなメンバーがあるか(フィールド、メソッド)調査することだ。
Eclipseのoutlineを見れば、分かりやすい。
しかし、隠されたモジュール(exportsしていないため、見えないがrequireされたため、使用はできる)は基本的には、reflectionを許可していない。
めったにない状況だが、隠されたモジュールのreflectionを許可したい場合は、open
,opens
を入力し、module-infoを修正する。
<モジュール全体をreflection>
open module modulename{
...
}
<モジュールのパッケージをreflection>
module modulename{
...
opens package1;
opens package2;
}
<モジュールのパッケージを指定したモジュールのみreflection>
module modulename{
...
opens package1 to modulename,modulename2...;
opens package2 to modulename3;
}
Exception
ERROR
ハードウェアなどの問題により、アプリケーション実行できたない場合。
Exception(例外)
プログラム内の問題(間違った使用方法、コードの問題)により、起こったトラブル。
例外が発生してもプログラムは終了される。
javaは、例外が発生すると、例外クラスよりオブジェクを生成し、例外処理時、使用される。
すべての例外クラスは、Throwableを継承し、追加的にExceptionクラスを継承する。
例外は大きく、コンパイラがチェックできる例外と、チェックできないランタイム例外がある。
https://medium.com/@bhagya.devduni98/exception-handling-headfirst-java-chapter-11-1f5664501e2e
例外処理コード
例外が生じた際に、プログラムを終了せずに、続くため処理するコードを例外処理という。
<flow>
try
-> catch
->finally
try内の例外が生じるとcatchで例外を処理し、finally
に渡す。
ただし、例外が生じても、生じなくてもfinally
は実行される。
Discussion