2010-12-27 10 views
3

なぜ(整数/ロング/ ...)などのJavaの数値/数値データ型がオーバーフロー例外を投げないのですか? 例えば:私たちは、私が知っている** **最大valが予想外-2Java Numberデータ型がオーバーフローするのはなぜですか?

Integer val = Integer.MAX_VALUE * 2; 
System.out.println("Max val unexpected" + val); 

を以下のための数学的に間違った答えを得ます。コアでは、これらのデータ型はプリミティブなJavaデータ型を使用します。 でも、...ValueOverflowExceptionのようなものを投げて間違った答えを防ぐのは良い考えではありません。 この動作を拡張して追加する考えは、これらすべてのクラスは最終的なものです。

あなたの考えは&の意見を投稿してください。

+0

あなたの答えは何ですか? –

+0

これはディスカッションフォーラムではありません([FAQ](http://stackoverflow.com/faq)参照)。決定的な答えがないこれらのような質問は本当にここに属しません。それはまったく悪い質問ではありませんが、客観的に答えることはできません。設計上の決定であり、オラクルのフォーラムでより良い答えを得ることができます。 –

+0

@blob、これを行う言語はありますか?それについて考える。 – st0le

答えて

9

これらの型はプリミティブ型の単なるラッパーであるため、異なる動作をすると予期しないことがあります。これらのタイプが例外をスローしない理由の1つは、そのようなチェックが実行されると信じられないほど高価になり、プロセッサ上のこれらの整数タイプはオーバーフロー時に割り込みをトリガしません(対照的に浮動小数点タイプは割り込みさまざまなイベントのため)。任意の精度をサポートする場合は、BigInteger型に興味があります。

3

これは仕様が動作する方法です。詳細については、Java仕様の4.2 - Primitive Types And Valuesを確認してください。

+0

またはセクション15.17.1、最後の行に 'オーバーフロー、アンダーフロー、または情報の損失が発生する可能性があるにもかかわらず、乗算演算子*の評価は決して実行時例外をスローしません。 ' – Ishtar

+0

が受け入れられました!そのような操作が間違った結果ではなく例外をスローすると、それはもっと役に立ちました。だから、それについての一般的な意見を聞くことを求めていたのです。 – blob

+0

それは難しいコールです。私は同意する、これらの条件の例外を持つともっと役立つだろうが、それは追加のテストを意味し、より多くのCPU時間を要するだろう。最善の解決策、IMHOは、オーバーフローの例外を可能にするJVMスイッチです。そうすれば、ユーザーは、より低速だがより安全であるかどうかを判断できます。 –

6

データ型がオーバーフローして、その例がそれを証明します。彼らがしないことは、オーバーフロー時に例外をスローすることです。

Javaでは例外が一般に宣言されなければならず、そうする際にはキャッチする必要があります。はい、これが成り立たないシナリオがいくつかあります(エラー、ランタイム例外など)が、例外の大部分についてはこのような規則が速く保持されます。

MathOverflowExceptionが必要な場合は、それをキャッチする必要があります。さもなければそれは目的を果たさないでしょう。それはあなたがそれは本当に厄介な取得する場所さて、これはこの

try { 
    int x = 5 + 7; 
} catch (MathOverflowException e) { 
    // do something 
} 

のように見えたコードを記述する必要がありますを意味します。何が例外をスローしますか?それは "プラス"記号でなければなりません、そうですか?まあ、まあまあです。オブジェクトのメソッドは例外をスローするので、プラス記号は "オブジェクト"の "メソッド"でなければなりません。5.この特別な場合は、オブジェクトのメソッドを逆参照しないでください。それ以外の場合は、次のようになります。

try { 
    int x = 5.+ 7; // Note the dot-plus ".+" 
} catch (MathOverflowException e) { 
    // do something 
} 

しかし、あなたはこれをやって開始した場合、あなたは操作のために括弧を必要としています。

try { 
    int x = 5.+(7); 
} catch (MathOverflowException e) { 
    // do something 
} 

これを行うと、「等号」の割り当ても方法であることを意味します。

try { 
    int x.=(5.+(7)); 
} catch (MathOverflowException e) { 
    // do something 
} 

が、我々はそれをする必要がありますので、 "新しい" のxを作成しませんでした:

try { 
    (new int x()).=(5.+(7)); 
} catch (MathOverflowException e) { 
    // do something 
} 

または多分

try { 
    new int x(5).+(7); 
} catch (MathOverflowException e) { 
    // do something 
} 

いずれかの方法で、それはより遠くに旅行ですシンプルな代数スタイルで、Javaはよく知られている代数/ C-ish/Fortran-ish構文を維持することに決めました。そうすることで、彼らは、オブジェクト指向の方法で数学構文をサポートする隠された "背後にある"ルールを作る必要があるか、または数学がオブジェクト指向であるという偽善を排除するだけでよいことをすぐに発見しました。彼らは後者を選んだ。

+0

優秀な説明!!! – SiB

関連する問題