2010-03-08 3 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'. И «HashMap » обеспечит гораздо лучшую производительность, если у вас есть большое количество токенов, так что подумайте об этом. –

+1

Еще одно замечание, иногда с тестовым кодом, подобным этому, когда вы делаете попытку/улов (исключение), чтобы избежать кучи исключений, я предпочитаю просто использовать свой основной бросок Исключение - это способ, которым я определяю код «Test/experimental» , В коде доставки, однако, никогда не перехватывайте Exception, перечислите те, которые вы действительно ожидаете. –

ответ

5

Массивы в Java являются фиксированной длины, так что я думаю, что вы действительно хотите сделать, это использовать List<Tokens>

например

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

и

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

, если вы не знаете заранее, количество элементов, вы будете иметь.

+0

Большое вам спасибо, мне нужен динамический массив, и это сработало :) – trinity

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[];.

EDIT: Вам нужно к нему, как показано ниже:

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

Измененный код: < согласно ответу Брайана AGNEW в>

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" }; 
Смежные вопросы