我的程序中出现错误:
Lyrics.java:11:错误:找不到符号
Cube(b); ^
symbol:method Cube(int)
location:class Lyrics
Lyrics.java:15:错误:不兼容的类型:从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);
}
}
答案 0 :(得分:5)
第一个问题是一个简单的拼写错误。 Java区分大小写,因此cube
和Cube
表示不同的含义。解决方案:1)保持一致,2)根据Java样式指南,使用以小写字母开头的方法名称...
第二个问题是由Math.pow
的方法签名引起的;见javadoc。它将结果返回为double
。然后,您尝试将double
作为int
返回, 是有损转换。
解决方案包括:
return b * b * b; // i.e. don't use `pow`.
或
return (int) Math.pow(b, 3);
第二个通过投射 double
返回int
直接解决了编译错误。这是告诉编译器有损转换实际上没问题的方法。
您看到的有损转换错误消息指的是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
的语义,所以它不知道" ...足够大值b
..." 。但它确实知道如果方法调用 返回足够大的值,那么转换将有损。这就是为什么消息说" 可能有损转换" 。
答案 1 :(得分:1)
两个问题:
Cube
与cube
不一样。cube(int)
返回一个整数,但Math.pow
的输出为double
。 您应该更改cube()
以返回double
。
然后,您需要在main
方法中添加更多代码才能使用调用cube
的结果。