有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我得到了这个方法:

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();
        }
    }
}

和{}:

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) 个答案

  1. # 1 楼答案

    Is there a specific situation in which the exception may not be caught?

    我突然想到了一些情况:

    • 代码(例如对foo()的调用)未执行。所以没有抛出异常
    • 异常是由不同的代码引发的;e、 g.在您的示例中,foo()方法是从其他地方调用的;e、 g.在不同的线程堆栈上
    • 这一例外情况在呼叫链的更深处被发现
    • 您已经声明了自己的异常(例如my.pkg.ArithmeticException),因此捕获的异常与抛出的异常不同
    • 如果你用类加载器做一些古怪的事情,那么可以多次加载同一个类。如果你这样做,你将有相同的名称,但实际上是不同的类型。如果使用异常类执行此操作,则处理程序执行的instanceof测试可能无法匹配

    Does a try-catch catches exceptions that happens in a method which is called inside it?

    对。如果你实施得当;见上图

    如果你想要章和节,读JLS 14.20


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

    您可以通过在ActivityB.onCreate中捕获异常并查看stacktrace来确认这一点

  2. # 2 楼答案

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

    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");
        }
    
    }
    

    在本例中,您指定希望在抛出时捕获算术异常。如果没有引发算术异常,但引发了不同的异常,例如IllegalArgumentException,那么它将不会捕获IllegalArgumentException,因为您只指定了算术异常

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

  3. # 3 楼答案

    可能发生的情况是,您试图捕获一个异常,而该异常不是被触发的异常。 在ArithmeticException的情况下,如果您启动一个,例如,NumberFormatException,它将不会保存Exception,并将停止您的应用程序

  4. # 4 楼答案

    如果捕获^{}Exception本身以及作为Exception子类型的所有异常都将被该块捕获。在Java中,这就是所谓的“检查异常”

    但是,您将无法捕获那些只是^{}的子类型的“异常”。确切地说,这些并非偶然的例外。这些都是错误。也可以在try-catch语句中捕获它们

    并不是说抓ExceptionThrowable都不是好的做法。始终捕获您预期的特定异常和错误