我是Java和Android的初学者。我的问题是当我在我的代码中使用setDefaultUncaughtExceptionHandler时,一些函数仍然需要一个围绕它的try / catch块,但我想把所有异常抛给UncaughtException线程。
public class MyAlarmReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Thread.setDefaultUncaughtExceptionHandler(new UnCaughtException(context));
try
{
String imageURL = MyWebService.readFeed();
DownloadAndSet.downloadFile(imageURL);
}
catch(Throwable e)
{
throw new RuntimeException(e);
}
Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:2)
Java区分已检查和未检查的异常。无论如何,已检查的例外必须被捕获。
更正:或者您必须在方法中添加throws
子句。这推迟了将异常捕获到方法调用者的冲动。
如果您希望在UncaughtExceptionHandler中处理它们,您可以"转发"它们:
try{
// blah "throws some checked exception type"
} catch ( Throwable e ) {
// throw e; <- This will not work :( unless you add the "throws" clause.
throw new RuntimeException(e);
}
不幸的是,只是抛出相同的Exception不会起作用,因为你必须添加你不想要的throws子句。您必须将它包装在RuntimeException中。
答案 1 :(得分:1)
必须捕获代码中的所有已检查异常。
进一步阅读已检查与未经检查的例外:
http://www.javapractices.com/topic/TopicAction.do?Id=129
http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
答案 2 :(得分:0)
当您调用抛出异常的方法时,要求您使用try/catch
或throw
处理异常相同的异常。
由于您不希望在代码中处理异常并希望所有异常都由Default Exception处理程序处理,因此您需要将throws
添加到您不想捕获的所有方法中例外。
答案 3 :(得分:0)
设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。
它与您必须捕获的例外无关。必须捕获/抛出的异常示例是IOException。您没有的异常示例是NullPointerException。
因此,如果您的代码导致NullPointerException,则默认处理程序将处理它。如果您的代码(可能)导致IOException,您必须在那里(通过捕获或抛出)处理它。
答案 4 :(得分:0)
我在程序中总是做的是创建一个异常处理程序方法,并在每次创建try/catch
块时调用它。很多时候我有Thread.sleep()
方法,我只是将异常发送到一个共同的地方进行“全局”处理。在全局异常处理程序中,您也可以参考此方法。
请记住,您可能并不总是想要使用此方法,因为如果文件已经存在,文件流之类的内容可能会抛出错误,并且您希望采用不同的方法,例如将其命名为其他方法,而不仅仅是停止程序。
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
catchException(e);
}
});
try {
Thread.sleep(1000);// Just an example of a possible exception thrower
}
catch (InterruptedException e) {
catchException(e);
}
}
public static void catchException(Throwable e) {
// Deal with the exception here
System.out.println("Oh no! You broke the program!!!");
System.out.println("Here is the error btw: " + e.getMessage());
}
如果您使用的是Eclipse,则可以为try/catch
块设置默认的自动代码生成,以自动包含此方法:
如果您不希望所有项目都出现此行为,也可以设置项目特定设置。