【问题标题】:Is it possible to throw ArrayIndexOutOfBoundsException?是否可以抛出 ArrayIndexOutOfBoundsException?
【发布时间】:2014-04-29 03:37:07
【问题描述】:
public void onClick(int row) {
    if (mItems.size() <= row) {
        return;
    }
    Action action = mItems.get(row);
}

调用 mItems.get() 是否安全?

编辑:从崩溃日志中,row 为 -1,然后抛出异常。

编辑:安全写作是:

if (row < 0 || row >= mItems.size()) {
...
}

【问题讨论】:

  • 看起来很安全。你得到一个例外吗?您要解决什么问题,我们只能看到您尝试的解决方案。
  • @Brian size() == rowif 条件检查返回。所以我想它是安全的。
  • @Keugyeol 是的 - 与我对答案的评论相同的概率。我的大脑拒绝从正确的方向阅读该比较,因为它是如何编写的。
  • @Elliott 为了避免崩溃,我添加了if 语句,但我仍然得到这个异常。

标签: java indexoutofboundsexception


【解决方案1】:

如果问题是,这段代码会抛出一个 ArrayIndexOutOfBoundsException 那么下面的情况会

如果将负值传递给 row ,则此代码以 java.lang.ArrayIndexOutOfBoundsException 结束

【讨论】:

  • 如果行值作为 -1 传递,条件大小(比如 0)
  • 呸,你是对的……在我的脑海里,这是因为他们是如何写的。道歉。
  • @ranjit 我认为mItems.size() 永远不会是负值,因此if 条件将始终过滤掉row 为负的情况。因此,上面的代码看起来是安全的,不会抛出 OOB 异常。
  • @ranjit 你说得对,如果行值为负数会崩溃。
【解决方案2】:

ArrayIndexOutofBoundsException 是未经检查的异常。因此,java 编译器不会检查给定的代码块是否抛出它。

如果抛出此异常,则您的索引超出了数组的范围 - 正如异常名称所告诉您的那样。

讨论已检查和未检查异常的链接: http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

编辑: 在您的特定实例中,是否有另一个线程访问 mItems?因为这可能会使 mItems 的大小在您检查它的大小和索引到它的那一刻之间发生变化。

【讨论】:

    【解决方案3】:

    是的,看起来很安全。

    您的问题似乎没有显示您对给定问题的努力或研究。 您是否尝试过编译并测试运行具有某些 row 值的代码?

    你可以在这样做的时候自己弄清楚。

    【讨论】:

      【解决方案4】:

      你可以抛出任何类型的异常,无论是选中还是未选中。

      只有经过检查的编译器会强制您处理,但对于未经检查的 ArrayIndexOutOfBound 异常编译器不会抱怨。

      在你的代码中你可以像下面这样抛出它

      public void onClick(int row) {
          if (mItems.size() <= row) {
              throw new ArrayIndexOutOfBoundsException();
          }
          Action action = mItems.get(row);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-09
        • 2023-03-16
        • 1970-01-01
        • 2012-04-12
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        相关资源
        最近更新 更多