2017-12-06 7 views
0

私はこのフォーマットlong val = 1_000_000L;がjavaで有効であるという事実を承知していますが、非構成型であるとわかったのは、Stringとして渡された場合、このフォーマットを解析しないLong#parseLongメソッドの動作です。私はいつも例外を得る:javaは、アンダースコアでLong形式を受け入れますが、Stringを使用して構文解析しないのはなぜですか?

String h = "1_000_000L"; 
    long val = 1_000_000L; 
    System.out.printf("this a valid format : %d\n", val); 
    try { 
     Long m = Long.parseLong(h); 
     System.out.println(m); 
    } catch (NumberFormatException e) { 
     System.out.printf("cannot parse this number : %s\n", h); 
    } 

NB。私は個人的なJavaコンパイラのようなものを構築しており、アンダースコア形式を取り除かずに動作したいと思っています。

+0

ハハー...以前はJavaプログラムでアンダースコアを使ったことはありません。また、あなたの個人用Javaコンパイラで幸運を祈ることができます。私は個人的なJavaの方言(JavaX)を作ったが、Javaのソースコードに変換してから、Eclipseコンパイラを呼び出す。 –

+0

長いAPIは長い時間前に決定されました。既存のプログラムのセマンティクスを変更することによって、既存のプログラムを破壊する危険性があります。 –

+0

コンパイラの作業のこの時点で、トークナイザの詳細を学ぶことをお勧めします。 –

答えて

0

ソースコードで入力できる数値リテラルは、Stringから解析された数値と同じように動作するという要件はありませんでした。ここで

Javadocs of Long.parseLong次のとおりです。最初の文字がASCIIのマイナス記号であってもよいこと を除き、すべての小数点以下の桁でなければならない文字列で

文字「 - 」(\ u002D ') に示します負の値またはASCIIプラス記号 '+'( '\ u002B')〜 は正の値を示します。

したがって、アンダースコアは許可されませんが、接尾辞はLです。これは、ソースコードからのフォーマットの数を解析することを意図したものではありません。

The underscores in numeric literals were introduced in Java 7ただし、プログラム可能な文字列の解析ではなく、ソースコードの可読性を向上させるためだけです。

Java SE 7以降では、任意の数のアンダースコア(_)を数値リテラルの桁の間の任意の数字で表すことができます。この機能を使用すると、たとえば、数値リテラルの数字のグループを区切ることができ、コードの可読性が向上します。

これらの機能は完全に別個のものであり、互いに矛盾するものではありません。

NumberFormatExceptionあなたが期待しているとおり、正常に動作しています。

+0

あなたの啓発のおかげで、ありがとう、なぜ私はそれがJavaコンパイラによると有効な形式であることを知って動作しなかったのだろうか? –

関連する問題