Java中的数组变量初始化错误
我正试图编写一个Java程序,读取由URL组成的输入文件,从中提取令牌,并跟踪每个令牌在文件中出现的次数。我编写了以下代码:Java中的数组变量初始化错误,java,initialization,Java,Initialization,我正试图编写一个Java程序,读取由URL组成的输入文件,从中提取令牌,并跟踪每个令牌在文件中出现的次数。我编写了以下代码: import java.io.*; import java.net.*; public class Main { static class Tokens { String name; int count; } public static void main(String[] args) {
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);
}
}
}
但当我运行它时,它说:变量t未初始化。。我应该做些什么来纠正它 初始化它:
// Declaration:
Tokens[] t;
// Initialization:
t = new Tokens[10]; // (Or whatever your desired length is)
您可以将声明和初始化结合起来,许多人都可以这样做。我不喜欢这样做,但是:
Tokens[] t = new Tokens[10];
你也会有同样的问题
您可能希望查看接口及其各种实现,而不是使用数组。Java中的数组是固定长度的,因此我认为您真正想要做的是使用列表
e、 g
除非您事先知道您将拥有的项目数量。您不是在初始化令牌t[];在使用它之前
编辑:您需要按如下方式进行编辑:
Tokens[] t = new Tokens[100]; // 100 is just an example
或者使用列表。您的代码声明t将表示一个令牌数组 但是,它没有定义该数组 根据,您需要一行,如:
t = new Tokens[10]; // Or however large the array should be
修改后的代码:<根据Brian 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);
}
}
}
请注意,您不应该使用类似C的数组语法,即使用
String[] names = { "Walter", "Hans", "Bill" };
而不是
String names[] = { "Walter", "Hans", "Bill" };
在一个不相关的注释中,当设置find=true时,应该中断内部循环。如果你有大量的令牌,一个HASMAP会提供很多更好的性能,所以请考虑一下。另外一个注意事项,有时用这样的测试代码,在你尝试一个尝试/CeCExExt来避免一组异常的情况下,我更喜欢让我的主要抛出异常,这是我识别测试/实验代码的一种方式。然而,在shipping code中,never catch Exception列出了您实际期望的异常。非常感谢,我想要一个动态数组,这很有效:
String[] names = { "Walter", "Hans", "Bill" };
String names[] = { "Walter", "Hans", "Bill" };