私は今朝クラスの課題に取り組んでおり、これまでにチームメイトのすべてのプログラムで気づいた問題を解決したいと考えています。int/float/double 内のスペースが原因で Java が異常終了するという事実。
この問題を解決するために、私は非常にクレイジーなアイデアを思いつきましたが、特定の状況下では機能します。ただし、問題は、常に機能するとは限らず、その理由を理解できないことです。これが私の「主な」方法です:
import java.util.Scanner; //needed for scanner class
public class Test2
{
public static void main(String[] args)
{
BugChecking bc = new BugChecking();
String i;
double i2 = 0;
Scanner in = new Scanner(System.in);
System.out.println("Please enter a positive integer");
while (i2 <= 0.0)
{
i = in.nextLine();
i = bc.deleteSpaces(i);
//cast back to float
i2 = Double.parseDouble(i);
if (i2 <= 0.0)
{
System.out.println("Please enter a number greater than 0.");
}
}
in.close();
System.out.println(i2);
}
}
したがって、ここにクラスがあります。私は浮動小数点数を使用していますが、文字列にキャストできる限り、任意の型に使用できるように作成したことに注意してください。
public class BugChecking
{
BugChecking()
{
}
public String deleteSpaces(String s)
{
//convert string into a char array
char[] cArray = s.toCharArray();
//now use for loop to find and remove spaces
for (i3 = 0; i3 < cArray.length; i3++)
{
if ((Character.isWhitespace(cArray[i3])) && (i3 != cArray.length)) //If current element contains a space remove it via overwrite
{
for (i4 = i3; i4 < cArray.length-1;i4++)
{
//move array elements over by one element
storage1 = cArray[i4+1];
cArray[i4] = storage1;
}
}
}
s = new String(cArray);
return s;
}
int i3; //for iteration
int i4; //for iteration
char storage1; //for storage
}
さて、目標は、投稿の冒頭に記載されている問題を修正するために配列からスペースを削除することです。このコードはそれを達成する必要があると私が言えることから、入力の最初の文字がスペース。
たとえば、「2.0332」と入力すると、出力は「2.0332」になります。
ただし、「2.03 445」と入力すると、出力は「2.03」になり、残りはどこかに失われます。
この 2 番目の例は、修正方法を理解しようとしているものです。
編集:
以下のDavidの提案は、問題を解決することができました. int の送信をバイパスしました。それを文字列として直接送信してから、目的の変数型に変換します (これは常にキャストと説明されています)。上記の Main メソッドに配置されたコードを修正しました。
ちょっとした注意点として、replace の方がはるかに簡単ですが、これを使用する予定がある場合は、deleteSpaces の if ステートメントに && チェックを追加して、if ステートメントが最後の配列要素でない場合にのみ実行されるようにしてください。 cArray. i3 を介して最後の要素の値を i4 を i3 の値に設定する次の for ループに渡すと、OutOfBounds エラーがトリガーされます。これは、最後の要素 - 1 までしかチェックしないためです。