Skip to content

Commit 94358f5

Browse files
committed
Silently exit thread on uncaught exception
1 parent 6229e47 commit 94358f5

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

java_runtime/src/classes/java/lang/thread.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use event_listener::Event;
55

66
use java_class_proto::{JavaFieldProto, JavaMethodProto};
77
use java_constants::MethodAccessFlags;
8-
use jvm::{Array, ClassInstanceRef, Jvm, Result};
8+
use jvm::{Array, ClassInstanceRef, Jvm, Result, runtime::JavaLangString};
99

1010
use 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

Comments
 (0)