はじめに
この実験では、Java で与えられた文字列が倍精度浮動小数点数に正常に変換できるかどうかを判断する方法を学びます。Double.parseDouble() を使用して文字列を解析するプロセスを調査し、文字列が有効な数値表現でない場合に発生する可能性のある NumberFormatException エラーを処理する方法を理解し、文字列が有効な 10 進数形式に準拠しているかどうかをチェックする方法について説明します。この実験の終わりまでに、Java アプリケーションで安全かつ効果的に文字列を倍精度浮動小数点数に変換する知識を身につけることができます。
Double.parseDouble() を使用した解析の試行
このステップでは、Java で数値の文字列表現を数値型に変換する方法を学びます。ユーザーからの入力を受け取ったり、ファイルからデータを読み取ったりする際に、入力は最初はテキスト(文字列)として読み取られることが多いため、これは一般的なタスクです。
Java にはこの変換を行ういくつかの方法が用意されています。文字列から倍精度浮動小数点数に変換する最も一般的な方法の 1 つは、Double.parseDouble() メソッドを使用することです。
これを実証するために、簡単な Java プログラムを作成してみましょう。
HelloJava.javaファイルがまだ開いていない場合は、WebIDE エディタで開きます。ファイルの内容全体を次のコードに置き換えます。
import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); // 入力文字列を double 型に解析しようと試みる double number = Double.parseDouble(userInput); System.out.println("You entered: " + number); scanner.close(); } }このコードの新しい部分を見てみましょう。
System.out.print("Enter a decimal number: ");:この行は、ユーザーに 10 進数の入力を促します。String userInput = scanner.nextLine();:これはユーザーの入力を文字列として読み取り、userInput変数に格納します。double number = Double.parseDouble(userInput);:これがこのステップの核心です。Double.parseDouble()はuserInput文字列を受け取り、それをdouble値に変換しようと試みます。文字列が 10 進数として正常に解釈できる場合、結果のdouble値はnumber変数に格納されます。System.out.println("You entered: " + number);:この行は、解析されたdouble値をユーザーに表示します。
ファイルを保存します(Ctrl+S または Cmd+S)。
次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、
~/projectディレクトリにいることを確認してから、次のコマンドを実行します。javac HelloJava.javaコンパイルが成功すると、何も出力されません。
最後に、プログラムを実行します。
java HelloJavaプログラムは、10 進数の入力を求めるメッセージを表示します。
123.45のような有効な 10 進数を入力し、Enter キーを押します。Enter a decimal number: 123.45 You entered: 123.45プログラムは入力を正常に解析し、その数値を表示するはずです。
このステップでは、Double.parseDouble() を使用して、10 進数の有効な文字列表現を double 型に正常に変換しました。しかし、ユーザーが有効な数値ではないものを入力した場合はどうなるでしょうか?次のステップでこれを調べます。
NumberFormatException の処理
前のステップでは、入力文字列が有効な 10 進数である場合の Double.parseDouble() の動作を見ました。では、ユーザーが数値に変換できないテキストを入力した場合はどうなるでしょうか?試してみましょう。
ターミナルで
~/projectディレクトリにいることを確認します。プログラムを再度実行します。
java HelloJava10 進数の入力を求められたら、
helloやabcのような明らかに数値ではないものを入力します。Enter a decimal number: helloEnter キーを押します。ターミナルにたくさんの赤色のテキストが表示されるでしょう。これはエラーメッセージで、具体的には
NumberFormatExceptionです。Exception in thread "main" java.lang.NumberFormatException: For input string: "hello" at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2050) at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.base/java.lang.Double.parseDouble(Double.java:651) at HelloJava.main(HelloJava.java:10)この
NumberFormatExceptionは、文字列 "hello" を有効なdouble値に解析できないために発生します。このような例外が発生し、それが処理されない場合、プログラムはクラッシュして実行を停止します。実際のアプリケーションでは、ユーザーが無効な入力をしただけでプログラムがクラッシュすることは望ましくありません。このようなエラーを適切に処理する方法が必要です。Java では、例外を処理するために
try-catchブロックを使用します。try-catchブロックは次のように動作します。- 例外を引き起こす可能性のあるコードは
tryブロックの中に配置されます。 tryブロック内で例外が発生した場合、catchブロック内のコードが実行されます。- 例外が発生しない場合、
catchブロックはスキップされます。
try-catchブロックを使用してNumberFormatExceptionを処理するようにプログラムを修正しましょう。- 例外を引き起こす可能性のあるコードは
WebIDE エディタで
HelloJava.javaファイルを開きます。Double.parseDouble()の呼び出しをtry-catchブロックで囲むようにコードを修正します。import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); try { // 入力文字列を double 型に解析しようと試みる double number = Double.parseDouble(userInput); System.out.println("You entered: " + number); } catch (NumberFormatException e) { // NumberFormatException が発生した場合、このコードが実行される System.out.println("Invalid input. Please enter a valid decimal number."); } scanner.close(); } }この更新されたコードでは、
Double.parseDouble(userInput);行はtryブロックの中にあります。catch (NumberFormatException e)ブロックは、tryブロック内でNumberFormatExceptionが発生した場合、catchブロック内のコードを実行することを指定しています。catchブロック内では、プログラムをクラッシュさせる代わりに、ユーザーに分かりやすいエラーメッセージを表示します。
ファイルを保存します(Ctrl+S または Cmd+S)。
修正したプログラムをコンパイルします。
javac HelloJava.javaプログラムを再度実行します。
java HelloJava入力を求められたら、再び
helloのような無効な入力を入力します。Enter a decimal number: hello Invalid input. Please enter a valid decimal number.今回は、プログラムはクラッシュする代わりに
NumberFormatExceptionを捕捉し、catchブロックからのメッセージを表示しました。これははるかに良いユーザー体験です!
これで、try-catch ブロックを使用して NumberFormatException のような例外を処理する方法を学びました。これにより、プログラムをより堅牢でユーザーフレンドリーにすることができます。
有効な小数形式のチェック
前のステップでは、try-catch ブロックを使用して NumberFormatException を正常に処理しました。これにより、入力が有効な数値でない場合にプログラムがクラッシュするのを防ぎます。ただし、現在のアプローチでは、文字列の解析を試み、解析に失敗した 後 でエラーを捕捉するだけです。
より積極的なアプローチは、解析を試みる 前 に入力文字列が有効な 10 進数形式かどうかをチェックすることです。これは正規表現やその他の検証手法を使って行うことができます。この実験では、ループ内で簡単なチェックを行い、有効な 10 進数が入力されるまでユーザーに入力を繰り返し求めます。
このアプローチでは、try-catch ブロックとループを組み合わせて、有効な入力を取得することを保証します。
WebIDE エディタで
HelloJava.javaファイルを開きます。有効な入力が得られるまで続くループをコードに追加するように修正します。
import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double number = 0.0; // デフォルト値で初期化 boolean validInput = false; // 有効な入力を追跡するフラグ while (!validInput) { System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); try { // 入力文字列を double 型に解析しようと試みる number = Double.parseDouble(userInput); validInput = true; // 解析が成功した場合はフラグを true に設定 } catch (NumberFormatException e) { // NumberFormatException が発生した場合、このコードが実行される System.out.println("Invalid input. Please enter a valid decimal number."); } } System.out.println("You entered a valid number: " + number); scanner.close(); } }変更点を見てみましょう。
double number = 0.0;:number変数をループの外で初期化します。boolean validInput = false;:ループを制御するためのブール型変数validInputを導入します。初期値はfalseです。while (!validInput):validInputがfalseの間、whileループが続きます。tryブロック内で、Double.parseDouble()が成功した場合、validInputをtrueに設定します。これにより、現在の反復処理の後にループが終了します。NumberFormatExceptionが発生した場合、catchブロックが実行され、validInputはfalseのままで、ループが続き、ユーザーに再度入力を求めます。- ループが終了した後(つまり
validInputがtrueの場合)、有効な入力が受け取られたことを確認するメッセージを表示します。
ファイルを保存します(Ctrl+S または Cmd+S)。
修正したプログラムをコンパイルします。
javac HelloJava.javaプログラムを実行します。
java HelloJavaまず無効な入力を試してから、有効な 10 進数を入力してみましょう。
Enter a decimal number: abc Invalid input. Please enter a valid decimal number. Enter a decimal number: 1.2.3 Invalid input. Please enter a valid decimal number. Enter a decimal number: 789.01 You entered a valid number: 789.01プログラムは、
Double.parseDouble()が正常に変換できる文字列を入力するまで、入力を求め続けます。
これで、プログラムがユーザーから有効な 10 進数を受け取るまで入力を続ける基本的な入力検証ループを実装しました。これは、多くのアプリケーションでユーザー入力を処理するための基本的なパターンです。
まとめ
この実験では、Java で文字列が double 型に変換できるかどうかをチェックする方法を学びました。まず、Double.parseDouble() メソッドを使用して文字列を double 型に解析する試みを行いました。このメソッドは、数値の文字列表現を数値型に変換する一般的な方法であり、ユーザー入力やファイルから読み取ったデータを扱う際に特に有用です。ユーザーに入力を求め、それを文字列として読み取り、Double.parseDouble() を使用して double 型に変換する簡単な Java プログラムを実装し、文字列から double 型への基本的な変換プロセスを実証しました。



