我的程序中出现错误:
Lyrics.java:11:错误:找不到符号
Cube(b); ^符号:方法Cube(int)
location:class歌词
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); } }
Stephen C.. 6
第一个问题是简单的拼写错误.Java是大小写敏感的,所以cube
并Cube
意味着不同的事情.解决方案:1)保持一致,2)根据Java样式指南使用以小写字母开头的方法名称...
第二个问题是由于方法签名Math.pow
; 看到javadoc.它返回结果为a double
.然后你尝试返回double
as int
,这是一个有损转换.
解决方案包括:
return b * b * b; // i.e. don't use `pow`.
要么
return (int) Math.pow(b, 3);
第二个通过将返回值转换为a 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
......的值".但它确实知道如果方法调用确实返回足够大的值,那么转换将是有损的.这就是消息说" 可能有损转换"的原因.
第一个问题是简单的拼写错误.Java是大小写敏感的,所以cube
并Cube
意味着不同的事情.解决方案:1)保持一致,2)根据Java样式指南使用以小写字母开头的方法名称...
第二个问题是由于方法签名Math.pow
; 看到javadoc.它返回结果为a double
.然后你尝试返回double
as int
,这是一个有损转换.
解决方案包括:
return b * b * b; // i.e. don't use `pow`.
要么
return (int) Math.pow(b, 3);
第二个通过将返回值转换为a 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
......的值".但它确实知道如果方法调用确实返回足够大的值,那么转换将是有损的.这就是消息说" 可能有损转换"的原因.