代入式の形態で入力した文字列から、=の左辺と右辺に分けて表示するプログラムを作成します。
式の文字列から左辺の文字列を取得するstaticメソッドをgetNameの名前、
右辺の文字列を取得するstaticメソッドをgetValueの名前で、それらメソッドを持つAssignmentのクラスを作成します。
以下に実行例を示します。(赤が入力です)
Z:\Java>java Assignment 代入式>abc=123 abcの名前に、123が設定
Z:\Java>java Assignment 代入式>xy=5+4 xyの名前に、5+4が設定
Z:\Java>java Assignment 代入式>abcdefg nullの名前に、nullが設定
Z:\Java>java Assignment 代入式>xy= xyの名前に、が設定
【考え方】 "="の文字列をindexOfメソッドで探して、先頭から見つかった位置までの部分文字列を、 substringメソッドで取得します。
import java.util.*;
public class Assignment {
public static String separator = "=";
public static String getName(String str){
int idx = str.indexOf(separator);// strの文字列からseparatorの位置を探す
if( idx == -1 ) return null;
String name = str.substring(0, idx);// strの文字列で、0からidxの部分文字列を取得
return name.trim();//name文字列前後の空白文字を除いた文字列を返す
}
public static String getValue(String str)
{
int idx = str.indexOf(separator);
if (idx == -1) return null;
String val = str.substring(idx + 1);// strの文字列のidx+1番目以降部分文字列を取得
return val.trim();
}
public static void main(String[] arg)
{
Scanner stdin = new Scanner(System.in);
System.out.print("代入式>");
String s1 = stdin.nextLine();
String n1 = Assignment.getName(s1);
String v1 = Assignment.getValue(s1);
System.out.println(n1 + "の名前に、" + v1 + "が設定");
}
}
次の実行結果のように、入力した文字列において、=の文字列の左右が、同じ文字並びかどうかを評価する 実験的なプログラムです。(赤が入力です)
Z:\Java>java Test 代入式>xxx = zzz xxxとzzzは一致しません
Z:\Java>java JTest02 代入式>xxx = xxx xxxとxxxで一致しました
【考え方】 前述で作成したAssignmentクラスのメソッドを利用すれば、簡単です。 切り出した左右の文字列比較は、equalsメソッドを使わないといけない点に注意ください。
import java.util.*;
public class JTest02{
public static void main(String[] arg){
Scanner stdin = new Scanner(System.in);
System.out.print("代入式>");
String s = stdin.nextLine();
String a = Assignment.getName(s);
String b = Assignment.getValue(s);
if (a.equals(b) == false){// a と bの文字列が正しくないかの判定
System.out.println(a + "と" + b + "は一致しません");
}else{
System.out.println(a + "と" + b + "で一致しました");
}
}
}
(PrintWriteに似ているクラスで、「PrintStream」があります。
System.outのクラスは、「PrintStream」になっており、printメソッドで自動的にフラッシュする仕様になっています。
new PrintWriter("test.html")の実行で、
"test.html" のファイルを作れます。
これで得られるのは、ファイルに書きこみストリームを管理するオブジェクトで、
後はclose()メソッドを実行するまでに、printlnメソッドなどによる書き込んだ順番のファイルが作られます。
なお、
このようなファイル操作などを使う場合は、メソッド定義で、throws Exception などの記述が必要となります。
既存のメソッドの中には、この記述が、なくてはならないものがあるのです。
import java.io.PrintWriter;
public class Test {
public static void makeFile() throws Exception {
PrintWriter pw = new PrintWriter("test.html");//ファイル作成
pw.println("<html>");//ファイルへの書き込み
pw.println("<body>");
pw.println("TEST");
pw.println("</body>");
pw.println("</html>");
pw.close();// ファイル処理を閉じる
}
public static void main(String[] argv) throws Exception {
makeFile();
}
}
作成される"test.html"の内容を以下に示します。
<html> <body> TEST </body> </html>
なお、makeFile直後のthrows Exception を記述しない場合は、コンパイル時で次のエラーが指摘されます。
Z:\Java>javac Test.java
Test.java:5: 例外 java.io.FileNotFoundException は報告されません。
スローするにはキャッチまたは、スロー宣言をしなければなりません。
PrintWriter pw = new PrintWriter("test.html");//ファイル作成
^
この意味は、「ファイルのオープンエラーに対する処理」を書かなければならない(スローしなければならない)意味のメッセージです。
その方法として、キャッチまたは、スロー宣言が必要という意味です。
そこで、上記プログラムでは、、スロー宣言(throws Exception )をしています。これはエラー例外を外部に任せる処理です。
例外エラーがあればこの情報をメソッドの呼び出し側へthrows(投げる)指示です。
そこでもエラー処理をしない場合は、
またメソッドの呼び出し側へthrows(投げる)する必要があります。
この場合であれば、PrintWriterに投げる指示があり、それをmakeFileメソッド内部で処理しないで呼び出し側へ投げています。
よって、mainで処理をしなければなりませんが、そこでもせずにまたthrows(投げる)ています。
この場合は、mainの呼び出し元にであるJVMがエラー検出することになり、ここで検出すると実行エラーで停止します。