我需要捕获线程运行时发生的线程异常。
我试图抛出新的异常,但它显示错误“未报告的异常......必须被捕获或声明被抛出”.2
如果不可能那么为什么?
如果你能解释原因。
这是我的代码
try {
log("Connecting to Module..");
int no = searchdevices.getSelectedIndex();
String Selectaddress = searchdevices.getString(no);
String name = Selectaddress.substring(0, 6);
String add = Selectaddress.substring(Selectaddress.indexOf("$") + 1);
if (no == -1) {
Alert al = new Alert("Warning", "" + no, null, AlertType.WARNING);
al.setTimeout(3000);
display.setCurrent(al);
}
final String fdata2 = "btspp://" + add + ":1;master=false;encrypt=false;authenticate=false";
finalurl = fdata2;
fbtname = name;
// fbtadd = add;
new Thread(new Runnable() {
public void run() {
try {
isConnOpen = true;
stream = (StreamConnection) Connector.open(fdata2);
in = stream.openInputStream();
out = stream.openOutputStream();
url2 = fdata2;
GoTo_Success();
} catch (IOException ex) {
throw new Exception();//in side exception
}
}
}).start();
} catch (Exception e) {
log("Please switch on bluetooth and then try again"); // want to catch here..
}
谢谢。
答案 0 :(得分:1)
当你在catch中抛出一个新异常时,你必须使用try..catch来处理它。
试试这个:
new Thread(new Runnable() {
public void run() {
try {
isConnOpen = true;
stream = (StreamConnection) Connector.open(fdata2);
in = stream.openInputStream();
out = stream.openOutputStream();
url2 = fdata2;
GoTo_Success();
} catch (IOException ex) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}//in side exception
}
}
}).start();
答案 1 :(得分:1)
假设一个线程在代码运行的同时运行,它怎么能捕获异常?一旦你调用start(),线程就会启动(好吧,在那个调用之后的某个时刻),程序的其余部分会继续执行catch。
例如,假设Thread是在名为“foo”的方法中创建并启动的。一旦你开始,foo方法到达结束并返回到任何调用它。然后调用方法“bar”。在那个时间点,新的Thread实际上被安排运行,因此挂起“bar”方法并执行Thread中的run方法。现在异常发生了。该计划距离你想要发生的捕获距离很远。即使不是程序的那部分就是睡着了。
答案 2 :(得分:0)
必须使用throws子句在方法声明中声明异常,然后才能使用throw new Exception();
如果您看到Thread.run()
,那么您会发现没有throws Exception
条款。因此,您将收到编译错误。
请参阅以下链接:
答案 3 :(得分:0)
如果您希望获得有关另一个线程中的例外的通知,则必须手动传输例外。
一个例子是使用Queue<Exception>
或类似的东西,你的工作线程会捕获任何异常并将其添加到队列中。
“主线程”(或特殊异常处理程序线程,或UI线程,或......)然后会定期轮询队列以查看是否有任何新异常,如果是,则可以显示它给用户。