[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12276] ズームイン Java での課題



  高橋(智)です。
  本日も早朝からお疲れ様でした。
  以下、ズームインJavaでの課題を書いておきます。

========================================================================================
1.2.4.3 ラベル
  [疑問]
    P15の最下行で「ラベルは行の先頭の文でしか宣言できない」とあるが、以下のような
    コードはどのようなコンパイルエラーになるのか?
      public class LabelTest {
        public static void main(String[] args) {
          System.err.println("test"); LOGLINE2:
        }
      }
    --> 結果は
    C:\tmp>javac LabelTest.java
    LabelTest.java:4: 式の開始が不正です。
      }
      ^


    では、以下のようなソースコードはOKか?
      public class LabelTest {
        public static void main(String[] args) {
          System.err.println("test"); LOGLINE2:;
        }
      }
     --> OK!!
    

1.2.5 assert
  [疑問]
    P17の最下部で「...評価する式...。結果がfalseの場合は、コンパイラがAssertErrorを
    発行します」とあるが、実際AssertErrorが発生した時何が起こるのか?
    VMが停止するのか? VMが終了するのか? 該当スレッドが終了するのか?
    以下のコード実行するとどうなるか?
     public class AssertTest implements Runnable {
       public static void main(String[] args) throws Exception {
         Thread t = new Thread(new AssertTest());
         System.out.println("start and join");
         t.start();
         t.join();
         System.out.println("end");
         System.in.read();
       }
 
       public void run() {
         assert(false);
       }
     }
    --> 結果は 
    start and join
    end
    と表示してキーボードからの入力待ちになる。つまり該当スレッドが終了する。


  [疑問]
    以下の、Javaの検査例外に関する記事のURLは?
      ■IBM developerWorksの記事「Javaの理論と実践:例外をめぐる議論」
      ■Bluce Eckelの記事 "Does Java need Checked Exception ?"
    --> 徹さんURLをお願いします


1.2.6 コンストラクタの連結
  [疑問]
    P26の第2段落で「super()と同様に、this()メソッドはコンストラクタの最初の行で
    使用しなければいけないため」とあるが、以下のコードはコンパイルできるのか?
     class A {
       public A() {
       }
     }
     class B extends A {
       public B() {
         super();
         this(10);
       }
       public B(int x) {
       }
     }
     public class InitTest {
       public static void main(String[] args) {
         new B();
       }
     }
    --> 結果は、もちろん
    InitTest1.java:9: this の呼び出しはコンストラクタの先頭文でなければなりません。
         this(10);
             ^

    では、上のコードから super(); の呼び出しを削って、クラスAのコンストラクタは
    何時呼び出されるのだろうか?
    --> コンパイラが、クラスAのデフォルトコンストラクタの呼び出しを追加している
        --> それでは、ソースコードの何処に追加するのだろうか?
            ひょっとして以下のコードを実行すると、System.out.println("A()"); が
            2度も実行されるのでは??        
               class A {
                 public A() {
                   System.out.println("A()");
                 }
               }
               class B extends A {
                 public B() {
                   this(10);
                 }
                 public B(int x) {
                   super();
                 }
               }
               public class InitTest {
                 public static void main(String[] args) {
                   new B();
                 }
               }
              --> もちろんそんなことはない。1度だけ。


========================================================================================

-- 
高橋智宏
  Java読書会( http://www.javareading.com/bof/ )