複数の値を取得するために使用System.currentTimeMillis()
しています。次に、一方を他方から減算して 2 つの値の差を取得し、その値を Robot クラスのdelay()
メソッドで使用しています。この値は整数として必要です。これは遅延メソッドが取るものだからです。アイデアはありますか?
3 に答える
long
値がに収まる場合はint
、次のように値をキャストできます。
int someInt = (int) someLong;
(または、amethodへの引数として直接robot.someMethod((int) someLong);
:)
int
は最大2147483647(および2147483647ms≈24。9日)の値を格納できることに注意してください。
他の回答やコメントが述べているように、オーバーフローの可能性を気にしない場合は、単純な型キャストが機能します。また、ユーザーインターフェイスの用語ではミリ秒は長い時間であるため、おそらく気にする必要はありません。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
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
または、オーバーフローを具体的に検出して処理する他の方法を使用することもできます。