• ベストアンサー

StringTokenizerクラスでのエラーについて

仕事で一人で組んでいるので、尋ねる相手がいません。 どなたか教えて下さいm(__)m かなり長い文字列を読込んで、その文字列を"!"を条件に分割したいので、以下のようなソースを書きました。 実行すると、NullPointerExceptionが発生します。 public class Split2 { public static void main(String args[]) throws IOException { //サンプルファイルの読込み BufferedReader red = new BufferedReader(new FileReader("getRoute_ResultSample_1.txt")); String line; while ((line = red.readLine()) != null) { System.out.println(line); } red.close(); StringTokenizer strToken = new StringTokenizer(line, "!"); int cnt = strToken.countTokens(); 文字列分割処理の一番最初の処理として"1"で区切り、その数をまず取得したいのです。 私は結構初心者PGです。 よろしくお願い致しますm(__)m

  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

while ((line = red.readLine()) != null) { System.out.println(line); } を抜けるときにlineは必ずnullなので、 StringTokenizer strToken = new StringTokenizer(line, "!"); が例外をはいているのではないでしょうか。 プログラムの意図が良く分かりませんが、 ファイルの最終行のみを処理したいのですか?

その他の回答 (2)

  • yuchi-co
  • ベストアンサー率60% (29/48)
回答No.3

はい、やってみました。 lineがnull、最終行がnullなので、StringTokenizer strToken = new StringTokenizer(line, "!");で落ちました・・・。 (私も初心者です)

  • yuchi-co
  • ベストアンサー率60% (29/48)
回答No.1

NullPointerExceptionが発生しているのは何行目でしょう? ソースを見るとStringTokenizerの部分ではNullPointerExceptionが発生していると思えません。 あるとしたら、ファイル読み込みのどこかじゃないでしょうか。 StringTokenizer strToken = new StringTokenizer(line, "!"); で表示はされてますか? されていないのであればそれ以前にNullPointerExceptionが発生しているはずです。 それと、メインメソッドにthrows IOException( スロー宣言)をつけるのはおかしいですね。 BufferedReader red = new BufferedReader(new FileReader("getRoute_ResultSample_1.txt")); 以下の部分をtry~catchするのが自然だと思います。 それに、このコードだと、ファイルの中身をいっきに分割するようにはなってません。 while ((line = red.readLine()) != null) { System.out.println(line); } で1行ずつ読み込んで、表示をしているだけなので StringTokenizer strToken = new StringTokenizer(line, "!"); の部分で分割しようとしてるlineの中身は最後の1行だけです。 長々と書きましたが、結局解決になってないようですみません・・・。

fatcatchoco
質問者

お礼

wotar-cooledさん、yuchi-coさん 早速の回答、ありがとうございます。 お二人の指摘で、自分がいかに愚かな事をしていたか気がつきました。 穴があったら入りたいくらい恥ずかしいです(>_<) でもお二人のアドバイスがなかったら、 気がつくのにもっと時間がかかったとは思います。 本当に感謝してます。 ちなみに、文字列は、1行でものすごーーーーく長いのです。 それを数種類のデリミタで区切って、 最後は配列に入れてXMLで出力するのです。 その第1歩で、コケたのでした^^; もう少し、この独り作業は続くので、 またお世話をかけるかと思います。 そんな時は、よろしくお願い致しますm(__)m

関連するQ&A

  • クラス StringTokenizerのコンストラクタ

    あるCSVファイルから行を読み込んで、以下のように文字列を配列に格納しようとしたのですが、カンマとカンマの間の文字列がNULLの時に、次のカンマにある文字列がずれて格納されてしまいます。 例外処理(if文)で処理を振り分けるなどとして、NULLもきちんと配列におさめるにはどのようにすればよろしいのでしょうか? ・ ・ line = csvfile.readLine(); StringTokenizer analy = StringTokenizer(line,","); String[] moji = new String[analy.countTokens()]; for (int n=0; n<moji.length; n++){ moji[n] = analy.nextToken(); } ・ ・

    • ベストアンサー
    • Java
  • StringTokenizerについて

    JAVAの勉強をしているのですが、StringTokenizerの役割がよく分かりません。検索サイトを使って色々調べてみたのですが、「トークンを区切る」だとかよく分からない言葉が出てきて全く理解できません。以下はあるデータから項目を抽出するプログラムらしいのですが、参考としてこの例でStringTokenizerがどのような役割を果たしているのか教えて下さい。複雑で説明しにくければStringTokenizerそのものの説明でも十分です。よろしくお願いします。 BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); String line=""; try { int i=0; while ((line = reader.readLine()) != null) { int fcount=1; StringTokenizer st = new StringTokenizer(line); while (st.hasMoreTokens()) { switch (fcount) { case 2: //項目2:被説明変数Y data[i][0]=Integer.parseInt(st.nextToken()); break; case 4: //項目4:説明変数X data[i][1]=Integer.parseInt(st.nextToken()); break; default: // その他の項目 String dummy=st.nextToken(); break; } fcount++; } i++; } NofData=i;

    • ベストアンサー
    • Java
  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • StringTokenizerについて(エラー)

     java初心者です。この度、突貫工事でjavaのネットワークプログラムを作らねばならず、本などを参考にしながら独学でサーバーとクライアントを作成しています。 クライアントは正常に稼働するようなのですが、サーバーにはStringTokenizerの使い方に問題があるらしく、NullPointerExceptionというエラーが出て受信がうまくできません。(以下、エラーが検出される個所を抜粋) …………… ////runメソッド //クライアント処理スレッドの本体です public void run(){ try{ //logout受信まで繰り返します while(true){ //クライアントからのコマンドを読み取ります String line = in.readLine(); //nameが空の場合にはログインコマンドのみを受け付けます。 if(name == null){ StringTokenizer st= new StringTokenizer(line);////エラー箇所 String cmd = st.nextToken(); if("login".equalsIgnoreCase(cmd)){ name = st.nextToken(); server.loginUser(name);//loginメソッドへ } }else{ //nameが空でない場合はログイン済みなのでコマンドを受け付けます。 StringTokenizer st = new StringTokenizer(line); String cmd=st.nextToken();//コマンドの取り出し if("logout".equalsIgnoreCase(cmd)){ server.logoutUser(name);//logoutメソッドへ break;//logoutの場合にはループを終了します。 } } } ……………… 提出期限が迫っており、また、周囲にjavaの心得がある人がいないので困っています。不勉強で申し訳ありませんが、どなたか回答宜しくお願いします。 追伸:プログラムに関する知識が乏しいので用語の使い方が間違っているかもしれませんがご容赦ください。。。

  • CSVファイルの、列だけ取得したい

    FileReader filereader = new FileReader(FileName); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 0; while((line = bufferedreader.readLine()) != null) { int j = 0; StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { item[j][i]=stringTokenizerTest.nextToken().toString(); j++; } i++; } filereader.close(); このような記述で、CSVの中身を全て取得することは出来るのですが、 ある一列だけ取得する方法がわかりません。 具体的には、コンボボックスにCSVのある一列だけ表示させたいです。 (その後、重複なしの値のみにフィルタリングしたい) 現在は苦し紛れに、 combo1.setModel(new DefaultComboBoxModel(new String[] { item[1][3], item[1][4], item[1][5], item[1][6], item[1][7], item[1][8], item[1][9], })); などと、配列を使ってピンポイントで値を取得していますが これでは使えないので・・ アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaでの文字列からの数字抽出

    文字列内の数字だけを取り出したいとおもっています。 たとえばファイル内からreadline()で読み込んだ文字列が [0, 0] [-0.34063, 0.0756989] [-0.362579, 0.118652] [-0.36264, 0.118637] だったならば 配列内に {0,0,-0.34063,0.0756989,-0.362579,0.118652,-0.36264,0.118637 } のように格納したいのですが可能なんでしょうか? "["や空白のようなものを削除して数字だけを取り出したいのです。 現在はこのようにファイルの文字列を取得しています FileReader fr = new FileReader(inputpath); BufferedReader br = new BufferedReader(fr); String read = br.readLine(); よろしくお願いします。

    • ベストアンサー
    • Java
  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java
  • このクラスをもとに2

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列を反転(例えば"abc"→"cba")させて出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

    • ベストアンサー
    • Java
  • このクラスをもとに…。

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列をそのまま出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

  • StringTokenizerについて

    ファイルの読み込みをStringTokenizerを使ってやりたいのですが、 使い方がいまいち理解できません。今自分で作っているプログラムでは効率が悪いです。 プログラムの一部を載せるのでアドバイスお願いします。 <プログラム> InputStreamReader fisr = new InputStreamReader(client. getInputStream()); BufferedReader fin = new BufferedReader(fisr); String name = fin.readLine(); System.out.println(name); while(n!=10){ FileInputStream objFis = new FileInputStream("eitango"+rand[n]+".txt"); InputStreamReader objlsr = new InputStreamReader(objFis,"Shift_jis"); BufferedReader objBr = new BufferedReader(objlsr); PrintWriter out = new PrintWriter(client.getOutputStream(),true); //1行ずつファイルを読み込む if (n==0){ out.println("Hello,clientNo:" + number +"\n"); } for(a=0;a!=6;a++){ if(a==5){ String ans = objBr.readLine(); ans2 = ans.length(); System.out.println("ans2 = "+ans2); } if(a!=5){ out.println(objBr.readLine()); } }

    • ベストアンサー
    • Java

専門家に質問してみよう