- - PR -
「シンボルを見つけられません。」でコンパイルできません
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-11 15:01
はじめまして。信三郎と申します。
Javaでプログラミングを始めまして、あるフォーマットのテキストを読み込むパーサを書き始めたのですが、いきなりコンパイルエラーで詰まってしまいました。周囲にJava使いが居ないので、どなたかご教示いただけないかとやってまいりました。 テキストの2行目にnode数があり、そのnode数を使ってクラスの配列を取りたいと思っています。 > type readtext.java import java.io.*; import java.util.*; class NodeCoordinates { public double x; public double y; } class Text{ void readtext(String FileName) { String line, s1; int i,LineNumber,n,nn; BufferedReader fi = new BufferedReader(new FileReader(FileName)); LineNumber = 0; while((line = fi.readLine()) != null) { //最終行か? LineNumber++; StringTokenizer tk = new StringTokenizer(line); if(LineNumber == 1) { continue; //1行目読み飛ばし } if(LineNumber == 2) { s1 = tk.nextToken(); //トークンの抽出 n = Integer.parseInt(s1); NodeCoordinates node[] = new NodeCoordinates[n+1]; //クラス確保 continue; } if(LineNumber >= 3 && LineNumber <= n+2) { s1 = tk.nextToken(); nn = Integer.parseInt(s1); node[nn] = new NodeCoordinates(); //クラス実体確保 s1 = tk.nextToken(); node[nn].x = Double.parseDouble(s1); s1 = tk.nextToken(); node[nn].y = Double.parseDouble(s1); } } } } public class readtext { public static void main(String arg[]){ Text txt = new Text(); txt.readtext(arg[0]); } } コンパイルメッセージ; D:\home\users\shin\Java\CD>javac readtext.java readtext.java:30: シンボルを見つけられません。 シンボル: 変数 node 場所 : Text の クラス node[nn] = new NodeCoordinates(); //クラス実 体確保 ^ readtext.java:32: シンボルを見つけられません。 シンボル: 変数 node 場所 : Text の クラス node[nn].x = Double.parseDouble(s1); ^ readtext.java:34: シンボルを見つけられません。 シンボル: 変数 node 場所 : Text の クラス node[nn].y = Double.parseDouble(s1); ^ エラー 3 個 D:\home\users\shin\Java\CD> CLASSPATHには".;%JAVA_HOME%\lib\tools.jar"、JAVA_HOMEには"C:\Program Files\Java\jdk1.5.0_05"が設定されています。どうかご教示お願いします。 | ||||||||
|
投稿日時: 2005-11-11 15:07
現象が発生する最小限のコードを作ってみましょう。
原因がわかるかと思います。 | ||||||||
|
投稿日時: 2005-11-11 15:11
このようになっていると、node変数の有効範囲はifブロックの中のみになりますので、 ifブロックの外でnode変数を使用しようとするとエラーになります。
としておけば、コンパイルは通るようになるでしょう。 | ||||||||
|
投稿日時: 2005-11-11 17:13
早速の御返事ありがとうございます。
前記のソースでもずいぶん削ぎ落としたつもりだったのですが、まだまだ冗長だったようでお目汚し申し訳ありません。 さて、ご指摘を元に検討しまして、NodeCoordinates node[]をwhile文の外に追い出してみました。例外処理や初期化の要求などをつぶしていったところ(ソースが膨れ上がってゆきます・・・)、三番目のif文の中で次の警告を出されてしまいました。 D:\home\users\shin\Java\CD\RT>javac readtext.java readtext.java:47: 変数 node は初期化されていない可能性があります。 node[nn] = new NodeCoordinates(); //クラス実体確保 ^ エラー 1 個 そこで、 for (i=0; i<=n+1; i++) { node[i] = new NodeCoordinates(0.0, 0.0); } として(NodeCoordinatesに引数ありのコンストラクタを書きました)2番目もしくは3番目のif文の中で初期化できるかと考えたのですが、改善されません。さらにご教示願えないでしょうか。 | ||||||||
|
投稿日時: 2005-11-11 17:37
if文に入る前にnullで初期化しちゃうってのはどうでせう?
内容は全然理解してないけど(ヲイ) | ||||||||
|
投稿日時: 2005-11-11 18:11
null値で初期化というのは、具体的にどう記述すればよいのでしょうか(お恥ずかしい限りです・・・)。
2番目のif文を通過しないと配列nodeのサイズがわからないので、初期化はその後かとも思うのですが・・・NodeCoordinates node[]を宣言した直後あたりで(サイズのわからないまま)初期化する方法がありますでしょうか。 | ||||||||
|
投稿日時: 2005-11-11 18:24
NodeCoordinates node[] = null;
どうでつか? | ||||||||
|
投稿日時: 2005-11-11 18:27
コンパイル通りました!
ありがとうございます。 |
1