我有两种类似的方法,但它们的工作方式不同。 注意:getBytesDownloaded(),getFileSize()返回long。
此方法完全返回我期望的整数值(例如:51)
public int getPercentComplete() throws IOException
{
int complete = (int) Math.round(this.getBytesDownloaded()*100 / this.getFileSize());
return complete;
}
但是这个方法在运行时不会返回任何值(即使我将int更改为long),尽管编译好了:
public int getCurrentSpeed() throws IOException
{
long KBytesDownloaded = this.getBytesDownloaded() / 1024;
currentTime = System.currentTimeMillis();
int speed = (int) Math.round(KBytesDownloaded * 1000 / (currentTime - startTime));
return speed;
}
错误:
Exception in thread "Timer-0" java.lang.NoSuchMethodError: com.myclasses.Downloa
d.getCurrentSpeed()F
at test$2.run(test.java:87)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
要解决这个问题,我将int更改为float,它工作正常(例如:300.0)
public float getCurrentSpeed() throws IOException
{
long KBytesDownloaded = this.getBytesDownloaded() / 1024;
currentTime = System.currentTimeMillis();
float speed = KBytesDownloaded * 1000 / (currentTime - startTime));
return speed;
}
为什么两个类似的方法不返回相同的类型值?谢谢。
答案 0 :(得分:1)
当您在类中调用方法时会抛出NoSuchMethodError
,但该类没有该方法。当您已经有一个已编译的程序,然后在一个类中更改方法声明而不重新编译依赖它的类时,就会发生这种情况。
在这种情况下,您的test
课程已编译为在float getCurrentSpeed()
课程中调用Download
。然后,您将方法返回类型更改为int
,而不重新编译test
类,因此test
所需的方法不再存在,因此NoSuchMethodError
。当您将返回类型更改回float
时,问题就消失了。
如果您更改Download
中的返回类型,请不要忘记重新编译test
。
答案 1 :(得分:0)
我用一些随机的int,long和double变量测试了你的代码。
即使我没有尝试过很多测试用例,
他们似乎对我都很好。你是什么意思,它没有返回任何价值?
=============================================== ===
如果是无方法错误,请重新编译并再次运行。
如果这样做无效,请检查您是否正在调用正确的功能
答案 2 :(得分:-1)
Math.round()将float
或double
作为参数。
KBytesDownloaded * 1000 / (currentTime - startTime)
在此表达式中,KBytesDownloaded
为Long
。
问题是像Long/Long
这样的除法会截断小数点后的浮点值。
确保在转换为float
或double
之前输入强制转换以防止截断。
int speed = Math.round(KBytesDownloaded * (float) 1000 / (currentTime - startTime));