• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 public class Main {
18     static {
staticMethodCalledByClinit()19         staticMethodCalledByClinit();
20     }
21 
staticMethodCalledByClinit()22     private static void staticMethodCalledByClinit() {
23         // Test that DeliverException works when we need to unwind to a handler -- this method --
24         // that is currently a resolution stub because it's running on behalf of <clinit>.
25         try {
26             throwDuringClinit();
27             System.err.println("didn't throw!");
28         } catch (NullPointerException ex) {
29             System.out.println("caught exception thrown during clinit");
30         }
31     }
32 
throwDuringClinit()33     private static void throwDuringClinit() {
34         throw new NullPointerException();
35     }
36 
main(String[] args)37     public static void main(String[] args) {
38         checkExceptions();
39         checkTiming();
40     }
41 
sleep(int msec)42     public static void sleep(int msec) {
43         try {
44             Thread.sleep(msec);
45         } catch (InterruptedException ie) {
46             System.err.println("sleep interrupted");
47         }
48     }
49 
checkExceptions()50     static void checkExceptions() {
51         try {
52             System.out.println(PartialInit.FIELD0);
53             System.err.println("Construction of PartialInit succeeded unexpectedly");
54         } catch (ExceptionInInitializerError eiie) {
55             System.out.println("Got expected EIIE for FIELD0");
56         }
57 
58         try {
59             System.out.println(PartialInit.FIELD0);
60             System.err.println("Load of FIELD0 succeeded unexpectedly");
61         } catch (NoClassDefFoundError ncdfe) {
62             System.out.println("Got expected NCDFE for FIELD0");
63         }
64         try {
65             System.out.println(PartialInit.FIELD1);
66             System.err.println("Load of FIELD1 succeeded unexpectedly");
67         } catch (NoClassDefFoundError ncdfe) {
68             System.out.println("Got expected NCDFE for FIELD1");
69         }
70 
71         try {
72             System.out.println(Exploder.FIELD);
73             System.err.println("Load of FIELD succeeded unexpectedly");
74         } catch (AssertionError expected) {
75             System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
76         }
77     }
78 
checkTiming()79     static void checkTiming() {
80         FieldThread fieldThread = new FieldThread();
81         MethodThread methodThread = new MethodThread();
82 
83         fieldThread.start();
84         methodThread.start();
85 
86         /* start class init */
87         IntHolder zero = SlowInit.FIELD0;
88 
89         /* wait for children to complete */
90         try {
91             fieldThread.join();
92             methodThread.join();
93         } catch (InterruptedException ie) {
94             System.err.println(ie);
95         }
96 
97         /* print all values */
98         System.out.println("Fields (main thread): " +
99             SlowInit.FIELD0.getValue() + SlowInit.FIELD1.getValue() +
100             SlowInit.FIELD2.getValue() + SlowInit.FIELD3.getValue());
101     }
102 
103     static class FieldThread extends Thread {
run()104         public void run() {
105             /* allow SlowInit's <clinit> to start */
106             Main.sleep(5000);
107 
108             /* collect fields; should delay until class init completes */
109             int field0, field1, field2, field3;
110             field0 = SlowInit.FIELD0.getValue();
111             field1 = SlowInit.FIELD1.getValue();
112             field2 = SlowInit.FIELD2.getValue();
113             field3 = SlowInit.FIELD3.getValue();
114 
115             /* let MethodThread print first */
116             Main.sleep(5000);
117             System.out.println("Fields (child thread): " +
118                 field0 + field1 + field2 + field3);
119         }
120     }
121 
122     static class MethodThread extends Thread {
run()123         public void run() {
124             /* allow SlowInit's <clinit> to start */
125             Main.sleep(5000);
126 
127             /* use a method that shouldn't be accessible yet */
128             SlowInit.printMsg("MethodThread message");
129         }
130     }
131 }
132