【问题标题】:Java Exceptions and PostconditionJava 异常和后置条件
【发布时间】:2014-08-14 23:01:59
【问题描述】:

会发生以下哪些异常,会发生哪些异常?

// 前置条件:a 不为空

public String sampleClass(ArrayList<String> a, int b) {
    String t;
    int u;
    for (u = 0; u <= a.size(); u++) {
        t = (String)(a.get(u));
        if (t.length() == b) {
            return t;
        }
    }
    return null;
}
  • A) NullPointerException
  • B) IndexOutOfBoundsException
  • C) ClassCastException

我选择的答案:我用测试人员运行程序,我得到了 B。我认为 B 就是答案。

【问题讨论】:

  • 如果列表 a 不包含长度为 b 的字符串,因为您从 0 迭代到 a.size()(含),我会选择答案 B。如果 List a 包含空元素,它也可能是 A。如果您设法将除字符串之外的任何内容添加到列表 a 中,它也可能是答案 C。答案 D 和 E 在此方法中不太可能出现。

标签: java class exception return computer-science


【解决方案1】:

如果我们不知道 doSomething 是如何被调用的,那么您的问题就没有意义。根据情况,您几乎可以得到这些例外:

在某些情况下,您不会遇到任何异常。例如:

ArrayList<String> a = new ArrayList<>();
a.add("");
doSomething(a,0);

以下将抛出 NullPointerException :

ArrayList<String> a = new ArrayList<>();
a.add(null);
doSomething(a,0);

这会抛出一个 IndexOutOfBoundException :

doSomething(new ArrayList<>(),0)

最后,你会有一个 ClassCastException :

ArrayList a = new ArrayList();
a.add(new Object());
doSomething(a,0);

D 和 E 都不可能(只有当您使用数组并且您的代码不包含任何可能引发异常的特定算术运算时,D 才会发生)。

【讨论】:

  • 您可以通过将原始 List 强制转换为 List 来引发 ClassCastException。这样您就可以添加非字符串对象,而不会完全烦扰编译器。不过你会收到很多警告。
  • 这仍然会创建一个 ArrayList。 运算符推断泛型。像 ArrayList l = new ArrayList(); l.add(1); doSomething( ( ArrayList ) l ), 0 );
  • 我测试了它并得到了异常。这是我的消息的最后一个 sn-p。
  • 我发送该评论时不存在。所以那是我的错。
  • D 也不应该发生,因为 List.get 会抛出 IndexOutOfBoundsException 并且我相信没有其他代码可以抛出显示的 ArrayIndexOutOfBoundsException。
【解决方案2】:

下面是一个完全可运行的示例,它向您展示了 A、B、C 并且没有发生异常。

如果不说明 ArrayList 包含的内容,就无法完全回答问题。

public class Test {
    public static void main(final String... args) {
        try {
            Test.throwNullPointer();
        } catch (final Throwable e) {
            System.out.println(e);
        }

        try {
            Test.throwIndexOutOfBoundsException();
        } catch (final Throwable e) {
            System.out.println(e);
        }

        try {
            Test.throwClassCastException();
        } catch (final Throwable e) {
            System.out.println(e);
        }

        try {
            Test.noException();
            System.out.println("No Exception");
        } catch (final Throwable e) {
            System.out.println(e);
        }
    }

    public static void throwNullPointer() {
        final ArrayList<String> a = new ArrayList<>();
        a.add("a");
        a.add(null);
        a.add("c");
        Test.doSomething(a, 0);
    }

    public static void throwIndexOutOfBoundsException() {
        final ArrayList<String> a = new ArrayList<>();
        a.add("a");
        a.add("b");
        a.add("c");
        Test.doSomething(a, 0);
    }

    public static void throwClassCastException() {
        final ArrayList<String> a = new ArrayList<>();
        Test.doNaughtyStuff(a);
        Test.doSomething(a, 0);
    }

    private static void doNaughtyStuff(final ArrayList a) {
        a.add(new Object());
    }

    public static void noException() {
        final ArrayList<String> a = new ArrayList<>();
        a.add("");
        Test.doSomething(a, 0);
    }

    public static String doSomething(final ArrayList<String> a, final int b) {
        String t;
        int u;
        for (u = 0; u <= a.size(); u++) {
            t = a.get(u);
            if (t.length() == b) {
                return t;
            }
        }
        return null;
    }
}

输出:

java.lang.NullPointerException
java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String
No Exception

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多