-1

我有两种类似的方法,但它们的工作方式有所不同。注意: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;
    }

为什么两个相似的方法不返回相同的类型值?谢谢你。

4

3 回答 3

1

NoSuchMethodError当你调用一个类中的一个方法,但是这个类没有那个方法时会抛出A。当您已经有一个已编译的程序然后更改一个类中的方法声明而不重新编译依赖它的类时,可能会发生这种情况。

在这种情况下,您的test类被编译为float getCurrentSpeed()Download类中调用。然后您将方法返回类型更改为int不重新编译类,以便不再存在test所需的方法,因此. 当您将返回类型更改回时,问题就消失了。testNoSuchMethodErrorfloat

如果你改变了返回类型Download,别忘了重新编译test

于 2013-09-26T08:40:25.840 回答
0

我已经用一些随机的 int、long 和 double 变量测试了你的代码。

即使我没有尝试过很多测试用例,

他们似乎对我都很好。

你是什​​么意思它不返回任何值?

====================================================

如果是无方法错误,请重新编译并再次运行。

如果这没有帮助,请检查您是否调用了正确的函数

于 2013-09-26T08:30:34.043 回答
-1

Math.round()floatordouble作为参数。

KBytesDownloaded * 1000 / (currentTime - startTime)

在这个表达式中,KBytesDownloadedLong

问题是除法会Long/Long截断小数点后的浮点值。

确保在四舍五入之前键入 cast tofloatdouble防止截断。

 int speed =  Math.round(KBytesDownloaded * (float) 1000 / (currentTime - startTime));
于 2013-09-26T08:16:35.993 回答