配列(リスト)の範囲外のインデックスにアクセスしたときにどうなるか?
Java 2016/06/30
配列は 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 2015/01/10
NULL
が返される。このとき、PHP Notice: Undefined offset: 10
というようなNoticeが発生する。
前に@
を付けて @$arr[10]
のようにアクセスすると、Noticeの発生は抑えられる。
インデックスを負にすると後ろから数えてくれる機能などはない。
Python 2014/11/13
IndexError
の例外がスローされる。
インデックスを負にすると後ろから数えてくれるが、後ろから数えて先頭よりも前になってしまうと、やはり例外がスローされる。
Ruby / JRuby 2015/01/01
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 2013/11/05
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 2014/11/13
undefined
が返される。
インデックスを負にすると後ろから数えてくれる、という機能はなく、単に undefined
が返される。