在被调用的方法/函数Java / Android中处理异常?

时间:2017-12-13 10:23:23

标签: java exception try-catch

我有这个方法:

public void foo(){
    int test = 5/0;
}

我称之为:

try {
    foo();
} catch (Exception e){
    e.printStackTrace();
}

这会捕获ArithmeticException,但我看到我在try-catch内调用方法的情况,但它没有捕获异常。是否存在exception未被捕获的具体情况?

以下是澄清问题的示例: ActivityA中的try-catch块是否捕获ActivityB中的异常?我知道答案是否定的。但我想知道这背后的逻辑。

public class ActivityA extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_a);
            startActivity(new Intent(this, ActivityB.class));
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

ActivityB

public class ActivityB extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        int x = 5/0    
    }
}

对于所有认为这是一个重复问题的酷人,请给我一个关于StackOverFlow问题的链接,该问题回答了这个非常明确的问题:try-catch是否捕获在其中调用的方法中发生的异常?

4 个答案:

答案 0 :(得分:0)

可能发生的事情是你试图捕获一个不是被解雇的异常。 对于ArithmeticException,例如,NumberFormatException,例如,Exception,它将不会保留public class ResultsItem { private String model; private int id; private int distanceLon; private String brand; @Ignore private List<BidsItem> bids; private User user; @Ignore private List<FotosItem> fotos; // getters/setters... } 并停止您的申请。

答案 1 :(得分:0)

如果您抓住ExceptionException本身,并且该块将捕获所有Exception子类型的异常。在Java中,将是所谓的&#34;已检查的异常&#34;。

然而,你不会抓住那些&#34;例外&#34;这只是Throwable的子类型。确切地说,那些不是实际的例外。他们是错误。也可以在try-catch语句中捕获它们。

不是说捕捉ExceptionThrowable都不是一个好习惯。始终抓住您期望的特定例外和错误。

答案 2 :(得分:0)

如果指定要捕获的异常,例如

public void foo(numb, divisor) throws ArithmeticException {
    if (divisor == 0) throw new ArithmeticException();
    int ans = num / divisor;
}

@Test
public void tesfooWithZeroDivisor() {
    try {
        foo(5, 0);
    } catch (ArithmeticException e) {
        System.out.println("Can't divide by zero");
    }

}

在这种情况下,您指定要在抛出时捕获ArithmeticException。如果没有抛出ArithmeticException而是抛出异常,例如IllegalArgumentException,那么它将不会捕获IllegalArgumentException,因为您只指定了ArithmeticException。

在您的情况下,您使用了catch (Exception e),这意味着您没有指定异常,因此它将捕获任何抛出的异常。

答案 3 :(得分:0)

  

是否存在可能无法捕获异常的特定情况?

有些情况让人想起:

  • 未执行代码(例如对foo()的调用)。所以没有抛出异常。
  • 异常是由不同的代码引发的;例如在您的示例中,foo()方法是从其他位置调用的;例如在不同的线程堆栈上。
  • 这个例外被追加到了调用链上。
  • 您已声明自己的异常(例如my.pkg.ArithmeticException)并且您正在捕获因结果而引发的异常
  • 如果您使用类加载器执行时髦的事情,则可以多次加载同一个类。如果这样做,您将拥有具有相同名称但实际上不同的类型。如果您使用异常类执行此操作,则处理程序执行的instanceof测试可能无法匹配。
  

try-catch是否捕获在其内部调用的方法中发生的异常?

是。如果你已经正确实施了;见上文。

如果您想要章节和经文,请阅读JLS 14.20

关于您更新的示例,我不希望 ActivityA的异常处理程序看到ActivityB.onCreate中抛出的异常。我希望onCreate()可以被另一个线程调用。

您可以通过在ActivityB.onCreate中捕获异常并查看堆栈跟踪来确认这一点。