2010-03-08 40 views
0

我正在嘗試編寫一個Java程序,該程序讀取由URL組成的輸入文件,從這些文件中提取令牌並跟蹤每個令牌在文件中出現的次數。我已經寫了下面的代碼:Java中的數組變量初始化錯誤

import java.io.*; 
import java.net.*; 

public class Main { 

    static class Tokens 
    { 
     String name; 
     int count; 
    } 

    public static void main(String[] args) { 
     String url_str,host; 
     String htokens[]; 
     URL url; 
     boolean found=false; 
     Tokens t[]; 
     int i,j,k; 

     try 
     { 
      File f=new File("urlfile.txt"); 
      FileReader fr=new FileReader(f); 
      BufferedReader br=new BufferedReader(fr); 

      while((url_str=br.readLine())!=null) 
      { 
       url=new URL(url_str); 
       host=url.getHost(); 
       htokens=host.split("\\.|\\-|\\_|\\~|[0-9]"); 

       for(i=0;i<htokens.length;i++) 
       { 
        if(!htokens[i].isEmpty()) 
        { 
         for(j=0;j<t.length;j++) 
         { 
          if(htokens[i].equals(t[j].name)) 
          { t[j].count++; found=true; } 
         } 
         if(!found) 
         { 
          k=t.length; 
          t[k].name=htokens[i]; 
          t[k].count=1; 
         } 
        } 
       } 

       System.out.println(t.length + "class tokens :"); 
       for(i=0;i<t.length;i++) 
       { 
        System.out.println(
          "name :"+t[i].name+" frequency :"+t[i].count); 
       } 
      } 
      br.close(); 
      fr.close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 

但是當我運行它,它說:variable t not initialized.。我應該怎麼做才能正確設置?

+0

在一個不相關的註釋中,當你設置'found = true'時,你應該從內部循環中'break'。而且如果你有大量的標記,'HashMap '會提供更好的性能,所以也要考慮這一點。 – 2010-03-08 18:08:25

+1

另一個需要注意的是,有時候用這樣的測試代碼,你正在做一個try/catch(Exception)來避免一堆異常,我更喜歡我的主要異常 - 這是我確定「測試/實驗」代碼的一種方式。但是,在運輸代碼中,絕不會出現異常,請列出您實際期望的異常。 – 2010-03-08 18:18:43

回答

5

數組在Java中是固定長度,所以我覺得你真正想要做的是使用List<Tokens>

例如

List<Tokens> t = new ArrayList<Tokens>(); 

t.add(new Tokens(...)) 

,除非你事先知道你有項目的數量。

+0

非常感謝你,我想要一個動態數組,這工作:) – trinity 2010-03-08 19:03:03

1

初始化:

// Declaration: 
Tokens[] t; 

// Initialization: 
t = new Tokens[10]; // (Or whatever your desired length is) 

可以聯合聲明和初始化,和許多人。我不是這樣做的粉絲,但:

Tokens[] t = new Tokens[10]; 

您將有與htokens相同的問題。

你可能想看看List接口(及其各種實現),而不是使用數組。

1

在使用之前,您未初始化Tokens t[];

編輯:你需要它,如下:

Tokens[] t = new Tokens[100]; // 100 is just an example 

或者使用List<Tokens>

1

你的代碼聲明t代表一個令牌數組。

但是,它沒有定義該數組。

Java Documentation,你需要這樣一行:

t = new Tokens[10]; // Or however large the array should be 
0

修改後的代碼:<按布賴恩·阿格紐的答案>

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Main { 


     static class Tokens 
     { 
      String name; 
      int count; 
      Tokens(String str,int c) 
      { 
       name=str; 
       count=c; 
      } 
     } 


     public static void main(String[] args) { 

     String url_str,host; 
     String htokens[]; 
     URL url; 
     boolean found=false; 
     List<Tokens> t = new ArrayList<Tokens>(); 

     int i,j,k; 

     try 
     { 
      File f=new File("urlfile.txt"); 
      FileReader fr=new FileReader(f); 
      BufferedReader br=new BufferedReader(fr); 


      while((url_str=br.readLine())!=null) 
      { 
      url=new URL(url_str); 

      host=url.getHost(); 
      htokens=host.split("\\.|\\-|\\_|\\~|[0-9]"); 

      for(i=0;i<htokens.length;i++) 
      { 
       if(!htokens[i].isEmpty()) 
       { 
        found=false; 
        for(j=0;j<t.size();j++) 
        { 

         if(htokens[i].equals(t.get(j).name)) 
         { 
          k=t.get(j).count+1; 
          t.set(j,new Tokens(htokens[i],k)); 
          found=true; 
          break; 
         } 
        } 
        if(!found) 
        { 
         t.add(new Tokens(htokens[i],1)); 
        } 
       } 
      } 

      } 
      System.out.println(t.size() + "class tokens :"); 
      for(i=0;i<t.size();i++) 
      { 
       System.out.println("name :"+t.get(i).name+" freq :"+t.get(i).count); 
      } 
      br.close(); 
      fr.close(); 

     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 


    } 

} 
0

就更不用說了,你不應該使用類似C陣列語法,即使用

String[] names = { "Walter", "Hans", "Bill" }; 

而不是

String names[] = { "Walter", "Hans", "Bill" };