1. ホーム
  2. java

[解決済み】doubleからintへの非可逆変換の可能性があり、シンボルが見つからない【重複あり

2022-02-15 23:41:24

質問

というエラーがプログラムに表示されるのですが。

Lyrics.java:11: error: cannot find symbol

 Cube(b);
 ^

symbol: メソッド Cube(int)

場所: クラス Lyrics

Lyrics.java:15: error: incompatible types: double から int への非可逆的な変換の可能性

 return Math.pow (b, 3);
                   ^

2エラー

しかし、私はコメントを見て、私はまだ問題を理解していない、私のコードで二重はありませんなぜそれはこのように言うだろう。また、シンボルが見つからないというエラーも理解できません。また、シンボルが見つからないというエラーも理解できません。

  import static java.lang.Math.pow;
  import java.util.Scanner;

  public class Lyrics
  {
       public static void main(String []args)
       {
            int b;
            Scanner scan = new Scanner(System.in);
            System.out.println ("Enter a number: ");
            b = scan.nextInt();
            Cube(b);
       }
       public static int cube (int b)
       {
            return Math.pow (b, 3);
       }
}

解決方法は?

最初の問題は、単純なタイプミスです。 Javaは大文字と小文字を区別するので cubeCube は異なることを意味します。 解決策 1) 一貫性を持たせる。2) メソッド名には小文字で始まる名前を使う...Javaスタイルガイドに従う。


2つ目の問題は、メソッドのシグネチャが Math.pow を参照してください。 ジャバドック . その結果を double . 次に doubleint であり、かつ その は非可逆変換です。

解決策は以下の通りです。

  return b * b * b;   // i.e. don't use `pow`.

または

  return (int) Math.pow(b, 3);

2つ目は、コンパイルエラーに直接対処するために キャスティング double を返します。 int . これは、非可逆変換が実際にOKであることをコンパイラに伝える方法です。

あなたが見ているロッシー変換のエラーメッセージは、十分大きな値の b の結果は Math.pow(b, 3) として表現するには大きすぎる。 int 1 . 型キャストを使用すると、Java は "大きすぎる浮動小数点数を次のように変換します。 Integer.MAX_VALUE .

最初の解決策はより速く、よりシンプルなコードですが、もし b が大きすぎると、計算が黙ってオーバーフローしてしまい、無意味な答えが返ってきます。


アップデイト - もし、オーバーフローを常にエラーとして処理させたいのであれば

return Math.multiplyExact(b, Math.multiplyExact(b, b));

または

return Math.toIntExact((long) Math.pow(b, 3));

またはそのバリエーション。


1 - 実は、コンパイラは、以下のセマンティクスを知りません。 pow を知らないので の値が十分大きい場合、その値は0になります。 b ..." . しかし、それはメソッド呼び出しが した。 は十分に大きな値を返すので、変換 する がロスになる。 そのため、メッセージには "です。 可能 lossy conversion" .