- PR -

「シンボルを見つけられません。」でコンパイルできません

1
投稿者投稿内容
信三郎
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 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"が設定されています。どうかご教示お願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-11 15:07
現象が発生する最小限のコードを作ってみましょう。
原因がわかるかと思います。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-11 15:11
引用:

if(LineNumber == 2) {
s1 = tk.nextToken(); //トークンの抽出
n = Integer.parseInt(s1);
NodeCoordinates node[] = new NodeCoordinates[n+1]; //クラス確保
continue;
}


このようになっていると、node変数の有効範囲はifブロックの中のみになりますので、
ifブロックの外でnode変数を使用しようとするとエラーになります。

コード:
                NodeCoordinates node[];
                if(LineNumber == 2) {
                    s1 = tk.nextToken();            //トークンの抽出
                    n = Integer.parseInt(s1);
                    node = new NodeCoordinates[n+1];   //クラス確保
                    continue;
                }


としておけば、コンパイルは通るようになるでしょう。
信三郎
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 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/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2005-11-11 17:37
if文に入る前にnullで初期化しちゃうってのはどうでせう?
内容は全然理解してないけど(ヲイ)
信三郎
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 2005-11-11 18:11
 null値で初期化というのは、具体的にどう記述すればよいのでしょうか(お恥ずかしい限りです・・・)。
 2番目のif文を通過しないと配列nodeのサイズがわからないので、初期化はその後かとも思うのですが・・・NodeCoordinates node[]を宣言した直後あたりで(サイズのわからないまま)初期化する方法がありますでしょうか。
未記入
会議室デビュー日: 2005/10/26
投稿数: 12
投稿日時: 2005-11-11 18:24
NodeCoordinates node[] = null;
どうでつか?
信三郎
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 2005-11-11 18:27
 コンパイル通りました!
 ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)