Java 处理异常的示例代码

Java 处理异常的示例代码,java,android,exception,Java,Android,Exception,我是Android移动应用开发新手。 我想知道,如何处理异常,如HttpConnection相关异常或任何其他异常?我是否需要向用户显示警报对话框 请提供有关如何处理HttpConnection或类似类型异常的示例代码或项目源代码。如何处理异常取决于异常。如果异常是无法恢复的,并且用户需要知道,则可以捕获异常并在AlertDialog中显示: try { // do something } catch (SomeImportantException e) { AlertDialog.Bu

我是Android移动应用开发新手。 我想知道,如何处理异常,如
HttpConnection
相关异常或任何其他异常?我是否需要向用户显示
警报对话框


请提供有关如何处理
HttpConnection
或类似类型异常的示例代码或项目源代码。

如何处理异常取决于异常。如果异常是无法恢复的,并且用户需要知道,则可以捕获异常并在AlertDialog中显示:

try {
  // do something
} catch (SomeImportantException e) {
  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  builder.setMessage("User friendly text explaining what went wrong.");
  AlertDialog alert = builder.create();
  alert.show();
}
有关该对话框的详细信息,请参见

或者,如果异常是您可以处理的,您可以只记录有关异常的信息,然后继续

try {
  // do something
} catch (SomeLessImportantException e) {
  Log.d(tag, "Failed to do something: " + e.getMessage());
}

Java中有两种不同类型的异常:已检查和未检查。关于使用哪一个更好,存在着一场激烈的争论,这两种观点都是好的

基本上,Checked异常是从
java.lang.exception
派生出来的,它要求如果不将方法指定为“throws mycheckedeexception”,则必须在方法中捕获并处理异常

// throw the exception

void foo() throws MyCheckedException
{
    throw new MyCheckedException();
}

// or handle the exception

void foo()
{
    try {
       throw new MyCheckedException();
    } catch (MyRuntimeException e) {
        e.printStackTrace();
    }
}
java.lang.RuntimeException
派生的未经检查的异常既不需要在方法定义中指定“throws”,也不需要处理它

void foo()
{
    throw new MyUncheckedException();
}
Checked的优点是,当您尚未处理异常时,编译器将向您发出警告

void caller()
{
    try {
        foo();
    } catch (MyUncheckedException e) {
        CheckedException1 ce1 = e.getCause();
        ce1.printStackTrace();
    }
}
缺点是您必须为每个已检查的异常声明try/catch块或throws,并且上层代码可能会变得相当麻烦,试图处理所有不同类型的异常

出于这个原因,如果您小心,您可能更喜欢使用未检查的异常

顺便说一句,您只能在定义自己的异常类型时选择异常类型

当遇到来自Java或第三方库的异常时,您必须决定如何处理它。e、 如果第三方方法抛出CheckedException1,那么您必须处理它,或者将调用方法声明为“抛出CheckedException1”。如果希望避免使用选中的异常,那么可以将其包装为未选中的异常并抛出该异常

void foo() // no throws declaration
{
    try {
        thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
    }
    catch (CheckedException1 e) {
        throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
    }
}
请注意,您可以在不使用“throws”声明的情况下抛出未经检查的异常。要从更高级别访问原始CheckedException1,可以使用未检查异常的.getCause()方法

void caller()
{
    try {
        foo();
    } catch (MyUncheckedException e) {
        CheckedException1 ce1 = e.getCause();
        ce1.printStackTrace();
    }
}
。。。但是因为foo()的异常是未选中的,所以您不必处理它或声明“throws”

关于伐木,有不同的学派

  • 当异常发生时记录它(低级别)
  • 当它到达顶部(高级)时记录它
  • 当您有足够的信息来执行适当的操作和/或记录消息时,请将其记录下来。(中级)
  • 我发现的一个好策略是安装一个未捕获的异常处理程序,它将处理所有未捕获(显然未检查)的异常。这样,丢失的任何内容都将被记录下来,并可能在系统崩溃之前进行处理

    public class MyExceptionHandler implements UncaughtExceptionHandler 
    {       
        @Override
        public void uncaughtException(Thread thread, Throwable ex)
        {
            ex.printStackTrace();
        }
    }
    
    // In your high-level code
    Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
    

    对于可以优雅地处理的所有异常,请在模块中捕获并处理它们,在该模块中,您对情况有足够的了解,可以纠正问题,然后重试

    您可以使用提供此功能的ACRA插件或收集错误报告。
    免责声明:我是BugSense的创始人。

    这是我读过的关于异常处理的最好的解释,这很遗憾,因为我已经在谷歌上搜索了一两个小时。你应该得到更多的选票,先生。祝你好运,Gowie47!:)感谢您提供了一个处理第三方异常的好例子。虽然这个答案是准确的,但paiego下面的答案更有用。