【问题标题】:charAt method, exam paper QcharAt方法,试卷Q
【发布时间】:2014-03-22 11:35:15
【问题描述】:

以下哪些语句与 String 的 charAt() 方法有关 类是真的吗?

选择 2 个选项

A. charAt() 方法可以将 char 值作为参数。

B. charAt() 方法返回一个 Character 对象。

C.表达式 char ch = "12345".charAt(3) 会将 3 分配给 ch。

D.表达式 char ch = str.charAt(str.length()) 其中 str 为“12345”,会将 3 分配给 ch。

E.第一个字符的索引是0。

F。如果传递的值大于或等于字符串的长度(或小于 0),则抛出 StringIndexOutOfBoundsException。

G.如果传递的值大于或等于字符串的长度(或小于 0),则抛出 ArrayIndexOutOfBoundsException。

问题的答案是 A,E 。我的答案是E,F

论文的原因如下:两者 - ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException,扩展 IndexOutOfBoundsException 和 虽然在实践中,charAt 方法会抛出 StringIndexOutOfBoundsException,它不是一个有效的选项,因为 实现可以随意抛出一些其他异常,只要它是 IndexOutOfBoundsException

但这并没有什么意义,我很确定charAt() 会抛出StringIndexOutOfBoundsException。论文答案不正确吗?

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/lang/… 说是抛出 IndexOutOfBoundsException
  • 官方实现会抛出一个StringIndexOutOfBoundsException,但是另一个实现抛出一个ArrayIndexOutOfBoundsException是完全有效的,因为一个字符串是由一个字符数组支持的,或者只是一个IndexOutOfBoundsException。所以 F 或 G 都不正确,因为它依赖于实现。
  • 与其输入所有这些并询问抛出了哪种类型的异常,不如尝试一下然后看看抛出的是哪种异常不是更容易吗?
  • 即使它确实抛出了 StringIndexOutOfBoundsException,您也不应该依赖它,因为该方法的文档约定是抛出 IndexOutOfBoundsException。 Oracle 可以决定,在 Java 9 中,抛出一个扩展 IndexOutOfBoundsException 的 BrandNewException,而不会破坏记录在案的合同。如果您依赖抛出 StringIndexOutOfBoundsException,那么您依赖的实现细节可能会在未来发生变化。
  • @Zavior:同意。但也许测试允许参考javadoc,并衡量学生阅读和理解它的能力。这将是一个非常非常好的主意,因为这里提出的许多问题的答案都写在了 javadoc 中。

标签: java


【解决方案1】:

您的第二个答案不正确:charAt throws IndexOutOfBoundsException

选择“A”也是正确的,因为 Java 编译器会为您隐式地将 char 转换为 int(尽管使用 char 作为索引有意义的情况看起来很不自然)。

关于选择“E”是正确的,你是对的。

【讨论】:

    【解决方案2】:

    我认为:A - 正确,E - 正确

    A - true 因为每个 char 也隐含地是一个 int,即你可以做 int x = 'a';
    E - 明显正确,这是一个基本正确的陈述;

    B - false 因为它返回字符而不是字符;
    C - false,因为索引是基于 0 的;
    D - false,因为它会抛出异常;
    F, G - 只需检查 JavaDoc 或尝试示例;这些都是微不足道的。

    【讨论】:

    • 是的,我没注意到 ;) 我对 F 和 G 犹豫不决。
    【解决方案3】:

    感谢各位大大的意见

    我认为最好的答案:

    即使它确实抛出了 StringIndexOutOfBoundsException,您也不应该依赖它,因为该方法的文档约定是抛出 IndexOutOfBoundsException。 Oracle 可以决定,在 Java 9 中,抛出一个扩展 IndexOutOfBoundsException 的 BrandNewException,而不会破坏记录在案的合同。如果您依赖抛出的 StringIndexOutOfBoundsException,那么您依赖的实现细节可能会在未来发生变化。

    Java OCA SE7 周三考试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2018-12-25
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2017-06-18
      相关资源
      最近更新 更多