@@ -5,7 +5,7 @@ use event_listener::Event;
55
66use java_class_proto:: { JavaFieldProto , JavaMethodProto } ;
77use java_constants:: MethodAccessFlags ;
8- use jvm:: { Array , ClassInstanceRef , Jvm , Result } ;
8+ use jvm:: { Array , ClassInstanceRef , Jvm , Result , runtime :: JavaLangString } ;
99
1010use crate :: { RuntimeClassProto , RuntimeContext , SpawnCallback , classes:: java:: lang:: Runnable } ;
1111
@@ -96,7 +96,36 @@ impl Thread {
9696
9797 self . jvm . attach_thread ( ) ?;
9898
99- let _: ( ) = self . jvm . invoke_virtual ( & self . this , "run" , "()V" , [ ] ) . await ?;
99+ let result: Result < ( ) > = self . jvm . invoke_virtual ( & self . this , "run" , "()V" , [ ] ) . await ;
100+
101+ if let Err ( jvm:: JavaError :: JavaException ( x) ) = result {
102+ let string_writer = self . jvm . new_class ( "java/io/StringWriter" , "()V" , ( ) ) . await . unwrap ( ) ;
103+ let print_writer = self
104+ . jvm
105+ . new_class ( "java/io/PrintWriter" , "(Ljava/io/Writer;)V" , ( string_writer. clone ( ) , ) )
106+ . await
107+ . unwrap ( ) ;
108+
109+ let _: ( ) = self
110+ . jvm
111+ . invoke_virtual ( & x, "printStackTrace" , "(Ljava/io/PrintWriter;)V" , ( print_writer, ) )
112+ . await
113+ . unwrap ( ) ;
114+
115+ let trace = self
116+ . jvm
117+ . invoke_virtual ( & string_writer, "toString" , "()Ljava/lang/String;" , [ ] )
118+ . await
119+ . unwrap ( ) ;
120+
121+ tracing:: error!(
122+ "Uncaught exception in thread {}:\n {}" ,
123+ self . thread_id,
124+ JavaLangString :: to_rust_string( & self . jvm, & trace) . await . unwrap( )
125+ ) ;
126+ } else {
127+ result?;
128+ }
100129
101130 self . jvm . detach_thread ( ) ?;
102131
0 commit comments