配列(リスト)の範囲外のインデックスにアクセスしたときにどうなるか?

Java

配列は ArrayIndexOutOfBoundsException という例外がスローされる。 java.util.List などのコレクションは IndexOutOfBoundsException という例外がスローされる。

ArrayIndexOutOfBoundsException のスーパークラスは IndexOutOfBoundsException である。

インデックスを負にすると後ろから数えてくれる機能などはない。

class java.lang.IndexOutOfBoundsException | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/lang/IndexOutOfBoundsException.html

class java.lang.ArrayIndexOutOfBoundsException | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/lang/ArrayIndexOutOfBoundsException.html

PHP

NULLが返される。このとき、PHP Notice: Undefined offset: 10 というようなNoticeが発生する。

前に@を付けて @$arr[10] のようにアクセスすると、Noticeの発生は抑えられる。

インデックスを負にすると後ろから数えてくれる機能などはない。

Python

IndexError の例外がスローされる。

インデックスを負にすると後ろから数えてくれるが、後ろから数えて先頭よりも前になってしまうと、やはり例外がスローされる。

Ruby / JRuby

Array#[]Array#at では nil が返される。インデックスをマイナスにすると後ろから数えてくれる。

arr = [1, 2, 3]
p arr[2]  # => 3
p arr[3]  # => nil
p arr[-1] # => 3
p arr[-3] # => 1
p arr[-4] # => nil

Array#fetch では範囲外だった場合の動作を2番目の引数またはブロックで指定できる。指定しなかった場合は nil ではなく、IndexError が発生する。インデックスをマイナスにすると後ろから数えてくれるのは Array#[]Array#at と同じ。

arr = [1, 2, 3]

p arr.fetch(-1)
# 出力結果
# 3

begin
  p arr.fetch(-4)
rescue IndexError => e
  puts e
end
# IndexError が発生する。
# 出力結果
# index -4 outside of array bounds: -3...3

p arr.fetch(-4, -1)
# 出力結果
# -1

p arr.fetch(-4) { |index| puts "Hello #{index}"; -2}
# 出力結果
# Hello -4
# -2

Array#[], Array#at | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/=5b=5d.html

Array#fetch | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/fetch.html

Perl

undef が返される。 use warnings; と宣言していると、 Use of uninitialized value という警告がアクセス時に表示される。

インデックスを負にすると後ろから数えてくれる。後ろから数えて先頭よりも前になってしまうと、やはり undef になり、use warnings; と宣言していると、 Use of uninitialized value という警告が表示される。

my @a = (1, 2, 3);
print $a[-1]; # => 3
print $a[-3]; # => 1
print $a[-4]; # => Use of uninitialized value

JavaScript

undefined が返される。

インデックスを負にすると後ろから数えてくれる、という機能はなく、単に undefined が返される。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。