Ошибка инициализации переменной массива в Java - PullRequest
0 голосов
/ 08 марта 2010

Я пытаюсь написать программу на Java, которая читает входной файл, состоящий из URL-адресов, извлекает из них токены и отслеживает, сколько раз каждый токен появляется в файле. Я написал следующий код:

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.. Что я должен сделать, чтобы установить это правильно?

Ответы [ 6 ]

5 голосов
/ 08 марта 2010

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

, например

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

и

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

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

1 голос
/ 08 марта 2010

Ваш код объявляет, что t будет представлять массив токенов.

Однако он не определяет этот массив.

В соответствии с Java-документацией , вам нужна строка вроде:

t = new Tokens[10]; // Or however large the array should be
1 голос
/ 08 марта 2010

Вы не инициализируете Tokens t[]; перед его использованием.

РЕДАКТИРОВАТЬ : Вам нужно это, как показано ниже:

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

Или используйте List<Tokens>.

1 голос
/ 08 марта 2010

Инициализируйте это:

// Declaration:
Tokens[] t;

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

Вы можете объединить объявление и инициализацию, и многие это делают. Я не фанат этого, но:

Tokens[] t = new Tokens[10];

У вас будет такая же проблема с htokens.

Возможно, вы захотите взглянуть на интерфейс List (и его различные реализации) вместо использования массива.

0 голосов
/ 08 марта 2010

Просто отметим, что вы не должны использовать синтаксис C-подобного массива, т.е. использовать

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

Вместо

String names[] = { "Walter", "Hans", "Bill" };
0 голосов
/ 08 марта 2010

Модифицированный код: <согласно ответу Брайана Агнью>

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);
        }


    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...