Fixing a few bugs in the statistics printout.
[jpf-core.git] / src / main / gov / nasa / jpf / vm / UncaughtException.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18 package gov.nasa.jpf.vm;
19
20 import gov.nasa.jpf.util.Printable;
21
22 import java.io.PrintWriter;
23
24
25 /**
26  * represents the case of an unhandled exception detected by JPF
27  *
28  * This is a "controlflow exception", but I finally made my peace with it since
29  * UncaughtExceptions can be thrown from various places, including the VM (<clinit>, finalizer)
30  * and we can't rely on that all these locations can check for pc == null. Even if they would,
31  * at this point there is nothing to do anymore, get to the NoUncaughtProperty reporting
32  * as quickly as possible, since chances are we would be even obfuscating the problem
33  */
34 @SuppressWarnings("serial")
35 public class UncaughtException extends RuntimeException implements Printable {
36
37   ThreadInfo thread;
38   int xObjRef;          // the exception object reference (that went uncaught)
39
40   String     xClsName;
41   String     details;
42
43   //ArrayList  stackTrace; // unused -pcd
44
45   public UncaughtException (ThreadInfo ti, int objRef) {
46     thread = ti;
47     xObjRef = objRef;
48     
49     ElementInfo ei = ti.getElementInfo(xObjRef);
50     xClsName = ei.getClassInfo().getName();
51     details = ei.getStringField("detailMessage");
52   }
53   
54   public String getRawMessage () {
55     return xClsName;
56   }
57   
58   @Override
59   public String getMessage () {
60     String s = "uncaught exception in thread " + thread.getName() +
61               " #" + thread.getId() + " : "
62               + xClsName;
63     
64     if (details != null) {
65       s += " : \"" + details + "\"";
66     }
67     
68     return s;
69   }
70
71   @Override
72   public void printOn (PrintWriter pw) {
73     pw.print("uncaught exception in thread ");
74     pw.print( thread.getName());
75     pw.print(" #");
76     pw.print(thread.getId());
77     pw.print(" : ");
78
79     thread.printStackTrace(pw, xObjRef);
80     pw.flush();
81   }
82 }