0

複数の値を取得するために使用System.currentTimeMillis()しています。次に、一方を他方から減算して 2 つの値の差を取得し、その値を Robot クラスのdelay()メソッドで使用しています。この値は整数として必要です。これは遅延メソッドが取るものだからです。アイデアはありますか?

4

3 に答える 3

7

long値がに収まる場合はint、次のように値をキャストできます。

int someInt = (int) someLong;

(または、amethodへの引数として直接robot.someMethod((int) someLong);:)

intは最大2147483647(および2147483647ms≈24。9日)の値を格納できることに注意してください。

于 2012-07-27T23:27:03.707 に答える
1

他の回答やコメントが述べているように、オーバーフローの可能性を気にしない場合は、単純な型キャストが機能します。また、ユーザーインターフェイスの用語ではミリ秒は長い時間であるため、おそらく気にする必要はありません。2147483647

しかし、心配する必要がある場合は、これはもう少し堅牢になります。

long time1 = System.currentTimeMillis();
...
long time2 = System.currentTimeMillis();
...
long diff = time2 - time1;
if (diff >= Integer.MIN_VALUE && diff <= Integer.MAX_VALUE) {
    delay((int) diff);
} else {
    throw new SomeException("Delays > 2147483647 milliseconds not supported");
}

また、将来のある時点で、1970年1月1日からのミリ秒数が64ビットの符号付き整数に収まらなくなるという(理論上の)問題もあります。しかし、それは数十億年の間は起こらないでしょう-http://en.wikipedia.org/wiki/Year_2038_problem

于 2012-07-27T23:50:47.467 に答える
0

aioobeが言ったように

値が実際に常にintに収まることが確実な場合は、単純な型キャストが機能するはずです。

int delay_amt = (int)delay_amt_long

そうでない場合は、delay()関数を複数回呼び出すなどの追加の処理を行う必要があります。たとえば、n+1回です。

ここで、n = delay_amt_long/max_int_sizeおよびm=delay_amt_long%max_int_size

ここで、(p + 1)番目の反復の遅延時間はmであるため、次のようになります。

delay_amt_long = n * max_int_size + m

または、オーバーフローを具体的に検出して処理する他の方法を使用することもできます。

于 2012-07-27T23:49:46.883 に答える