0

このプログラムでコンパイル エラーが発生することを期待していましたが、正常にコンパイルされ、実行中にランタイム例外が発生しました。

class substr11
{

public static void main(String args[])
{

String s = "abcde";

System.out.println(s.substring(1,-1));

}


}

コンパイラ エラーは解析でき (文字列は本体自体で初期化されます)、この文字列操作によってコンパイル エラーが発生することがわかります。コンパイルエラーがスローされなかった理由を教えてもらえますか?

スレッド「メイン」での例外 java.lang.StringIndexOutOfBoundsException: 文字列インデックスが範囲外です: -2 at java.lang.String.substring(Unknown Source) at substr11.main(substr11.java:9)

4

7 に答える 7

0

コンパイルエラーがスローされなかった理由を誰かに教えてもらえますか?

これはコンパイル エラーではなく、Java プログラマー (およびその管理者!) は、これがコンパイル エラーではないことを信頼する権利があるためです。

別の世界では、Java 言語は、コンパイラーがその呼び出しを評価してエラーとしてフラグを立てようとすることを要求 (または許可) するように指定されていた可能性があります。substring

ただし、この世界では、Java コンパイラは「定数式」に対してのみそれを行うことが許可されています ( JLS 15.28で指定されているように)。メソッド呼び出しを含む式は、仕様によると「定数式」ではありません。したがって、実際には、substring呼び出し実行時に評価され、実行時例外が発生する必要があります。


では、なぜ Java はこのように設計されているのでしょうか。

Java 設計者に尋ねる必要があります...

...しかし、それは次の2つの組み合わせだと思います。

  • Java 1.0 言語は、早期にリリースする必要がありました。そうしないと、市場機会を逃してしまいます。

  • 次に、後方互換性に対する包括的な要件がありました...言語が進化しても古いJavaプログラムが引き続き機能するようにするためです。

于 2013-08-22T07:53:22.650 に答える