我的程序中出现错误:
Lyrics.java:11:错误:找不到符号
Run Code Online (Sandbox Code Playgroud)Cube(b); ^符号:方法Cube(int)
location:class歌词
Lyrics.java:15:错误:不兼容的类型:从double到int的可能有损转换
Run Code Online (Sandbox Code Playgroud)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);
}
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是简单的拼写错误.Java是大小写敏感的,所以cube并Cube意味着不同的事情.解决方案:1)保持一致,2)根据Java样式指南使用以小写字母开头的方法名称...
第二个问题是由于方法签名Math.pow; 看到javadoc.它返回结果为a double.然后你尝试返回doubleas int,这是一个有损转换.
解决方案包括:
return b * b * b; // i.e. don't use `pow`.
Run Code Online (Sandbox Code Playgroud)
要么
return (int) Math.pow(b, 3);
Run Code Online (Sandbox Code Playgroud)
第二个通过将返回值转换为a double来直接解决编译错误int.这是告诉编译器有损转换实际上是正常的方法.
您看到的有损转换错误消息是指对于足够大的值的事实b,结果Math.pow(b, 3)将太大而无法表示为int1.使用类型转换,Java将转换为"太大"的浮点数Integer.MAX_VALUE.
第一个解决方案是更快更简单的代码,但如果b太大,计算将无声地溢出,你会得到一个无意义的答案.
更新 - 如果您希望溢出始终被视为错误,则:
return Math.multiplyExact(b, Math.multiplyExact(b, b));
Run Code Online (Sandbox Code Playgroud)
要么
return Math.toIntExact((long) Math.pow(b, 3));
Run Code Online (Sandbox Code Playgroud)
或以上的变化.
1 - 实际上,编译器不知道pow它的语义,所以它不知道"......对于足够大的b......的值".但它确实知道如果方法调用确实返回足够大的值,那么转换将是有损的.这就是消息说" 可能有损转换"的原因.
| 归档时间: |
|
| 查看次数: |
36915 次 |
| 最近记录: |