我尝试编译我的个人联系人数据库程序,但我什么都没有 但“找不到符号”的错误 我应该经常实例化一个对象吗?如果没有,这段代码有什么问题?
我将writetoFile和readFile初始化移到了外部的try块,并在里面声明了它们,并且它有所帮助!现在唯一的编译器错误消息是最底层显示的消息。
import java.util.Scanner;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.Double;
import java.util.Arrays;
public class Contacts
{
String name;
String phone;
String addy;
String[] namesDB = new String[100];
int index=0;
public Contacts (String fullName, String phoneNo, String address)
{
name=fullName;
phone=phoneNo;
addy=address;
}
public String printName(String fullName)
{
for (index=0;index<100;index++)
{
if (fullName==namesDB[index])
System.out.println(namesDB[index]);
else
index++;
}
return namesDB[index];
}
public String deleteName(String fullName)
{
for (index=0;index<100;index++)
{
if (fullName==namesDB[index])
{
namesDB[index]= "0";
System.out.println("Record Deleted.");
}
else
index++;
}
return namesDB[index];
}
static String stripQuo(String str)
{
if (str.startsWith("\""))
{
str = str.substring(1, str.length());
}
if (str.endsWith("\""))
{
str = str.substring(0, str.length() - 1);
}
return str;
}
public static void main(String[] args)
{
String EMPTY = "Empty";
int index=0;
String[] namesDB = new String[100];
String fullName, phoneNo, address;
for (int i=0; i<100; i++)
{
Contacts w = new Contacts("-1", "-1", "-1");
w.namesDB[i]=EMPTY;
i++;
}
PrintWriter writetoFile=null;
BufferedReader readFile=null;
//Creating Writable File, PCD=Personal Contacts Database
try
{
writetoFile=new PrintWriter(new FileOutputStream("PCDFile.txt"));
readFile = new BufferedReader(new FileReader("PCDFile.txt"));
}
catch(FileNotFoundException ex)
{
System.out.println("Error opening PCDFile.txt");
System.exit(0);
}
catch(IOException gh)
{
System.out.println("Error reading from PCDFile.txt.");
System.exit(0);
}
//ADDING
if (args.length == 1)
{
String option=args[0];
if (option.equals("-a"))
{
for (int i=0;i<100; i++)
{
if(namesDB[i]==EMPTY)
{
System.out.println("Full Name: ");
Scanner keyboard = new Scanner(System.in);
fullName=keyboard.nextLine();
System.out.println("Phone: ");
phoneNo=keyboard.nextLine();
System.out.println("Address: ");
address=keyboard.nextLine();
Contacts w = new Contacts(fullName, phoneNo, address);
namesDB[i]="fullName/n" + "phoneNo/n" + "address/n";
writetoFile.println(namesDB[i]);
System.out.println(namesDB[i]);
}
else
index++;
}
}
//SEARCHING
else
{
option=stripQuo(option);
option=fullName;
String line= readFile.readLine();
for (index=0;index<100;index++)
{
if (line!=null)
{
if(line.equals(fullName))
{
Contacts w = new Contacts(fullName, phoneNo, address);
w.printName(fullName);
}
}
else
index++;
if (index==namesDB.length-1)
{
System.out.println("No record found for " + fullName + ".");
}
}
}
if (args.length == 2)
{
option=args[0];
fullName=args[1];
if (option.equals("-s"))
{
Contacts w = new Contacts(fullName, phoneNo, address);
fullName=w.stripQuo(fullName);
String line=readFile.readline();
for (index=0;index<100; index++)
{
if (line!=null)
{
if(line.equals(w.Contacts(fullName, phoneNo, address)))
{
w.printName(fullName);
}
}
else
index++;
if (index==namesDB.length-1)
{
System.out.println("No record found for " + fullName + ".");
}
}
}
else if (option.equals("-d"))
{
fullName=w.stripQuo(fullName);
String line=readFile.readline();
for (index=0;index<100; index++)
{
if (line!=null)
{
if(line.equals(w.Contacts(fullName, phoneNo, address)))
{
w.deleteName(fullName);
}
}
else if (index==namesDB.length-1)
System.out.println("No record found for " + fullName + ".");
else
index++;
}}}
writetoFile.close();
readFile.close();
}}}
编译器消息:
/Contacts.java:170: cannot find symbol
symbol : method readline()
location: class java.io.BufferedReader
String line=readFile.readline();
^
/Contacts.java:176: cannot find symbol
symbol : method Contacts(java.lang.String,java.lang.String,java.lang.String)
location: class Contacts
if(line.equals(w.Contacts(fullName, phoneNo, address)))
^
/Contacts.java:191: cannot find symbol
symbol : variable w
location: class Contacts
fullName=w.stripQuo(fullName);
^
/Contacts.java:192: cannot find symbol
symbol : method readline()
location: class java.io.BufferedReader
String line=readFile.readline();
^
/Contacts.java:197: cannot find symbol
symbol : variable w
location: class Contacts
if(line.equals(w.Contacts(fullName, phoneNo, address)))
^
/Contacts.java:199: cannot find symbol
symbol : variable w
location: class Contacts
w.deleteName(fullName);
^
答案 0 :(得分:3)
一些风格提示:
通常,避免使用if / else / loops而不使用括号,即使它们只包含一行代码。 特别是你有if括号和相应的else没有。这让我感到困惑。
数据库(DB)就像一种数据结构。最后用DB命名数组变量就像有一个变量“Set namesArrayList”。它只是说变量指的是它没有的东西。数组不是数据库。现在可能你可能想要改变你正在使用的数据结构,所以你可能只想调用它,'names'来指示它是一组东西而不指定数据结构等。
尽量不要写很多连续的无法解码的代码。代码。
if (args.length == 1) {
.. some huge slab here
} else if (args.length == 2) {
.. another huge slab here
}
如果难以阅读/跟踪。
最好把那些巨大的文本块放到函数中
if (args.length == 1) {
whatWeDoFor1Arg(..params here..);
} else if (args.length == 2) {
whatWeDoFor2Args(..params here..);
}
甚至:
if (args.length == 1) {
option=args[0];
if (option .equals(...) ) {
add(...) // or whatever
} else if (option.equals(...) ) {
search(..) // or whatever
}
} else if (args.length == 2) {
... etc ...
}
这使您的代码更具可读性。此外,函数名称的作用类似于子部分的自动注释(即函数中的内容)。此外,由于您重做了很多相同的代码,您可以在函数中执行此操作,然后多次调用该函数(使用不同的参数),即。重用它。
另外,您实际上是在尝试使用Contacts类。为什么没有一个班级来处理个人联系,例如:一个Contact类,比如姓名,地址,phoneNum,字段。还有一个处理联系人集合的类,例如:AddressBook类。其中包含的字段类似于:ArrayList&lt; Contact&gt;联系人,即。联系人的集合,以及一些操作方法,例如:添加,搜索,删除等。您不必在集合中存储每个对象的字符串表示,您可以自己存储实际对象。
这样做会使运行命令行的代码变得非常简单。
现在关于错误:
第一个错误:
Contacts.java:170: cannot find symbol symbol : method readline()
location: class java.io.BufferedReader String line=readFile.readline();
您错误输入了该函数的名称。它应该是readLine(),大写为L。
第二个错误:
^ /Contacts.java:176: cannot find symbol symbol : method
Contacts(java.lang.String,java.lang.String,java.lang.String)
location: class Contacts if(line.equals(w.Contacts(fullName, phoneNo, address)))
你到底想要做什么?您的联系人类没有联系方式。似乎很明显不言自明。去w.Contacts(),其中w是一个Contacts对象,试图调用一个名为Contacts的对象的方法(显然不存在)。现在,如果为Contacts定义一个toString()方法,它返回一个与你的名字列表中的字符串相同的String(即.namesDB)。然后你可以去:if(line.equals(w.toString())...
第三次错误:
^ /Contacts.java:191: cannot find symbol symbol : variable w
location: class Contacts fullName=w.stripQuo(fullName);
您实际上没有在此else语句中或在此else语句的“上方”任何位置声明名为“w”的Contacts变量。即。你还没有在这一行的“范围”中声明一个'w'变量。
所以你可以去:联系人w =新联系人(fullName,phoneNo,地址); 在else语句的顶部或在它之外的if语句中。
但是,这是狡猾的,因为你正在使用你从命令行arg获得的fullName创建一个Contacts对象(这部分很好),并且在主函数的顶部有一些未初始化的变量(address / phoneNo) !!!
实际上,由于这是一个静态方法,你应该真的去:Contacts.stripQuo()
您应该使用类的名称来调用静态方法,而不是该类的对象的名称(即使这可能有效)。 (见上文)。
第四个错误:
与第一次错误相同
第五个错误:
与第二个错误和第三个错误相同。
第六个错误:
与第三个错误相同。除了你实际上需要在一个对象上调用它(即因为它不是静态方法)
答案 1 :(得分:2)
您的writeToFile对象仅存在于创建它的try语句的范围内。在try块之外声明它,但在里面初始化它。
您的readFile对象也是如此。和w对象,只有它在if块中。你应该看一下变量范围: 语言/ VariableScope.htm“&GT; HTTP://www.java2s.com/Tutorial/Java/0020_Language/VariableScope.htm
答案 2 :(得分:1)
嗯,首先,Contacts w = new Contacts(fullName, phoneNo, address);
必须是几行,所以它在if括号之外,使其在以下if语句中可见。
接下来,.readline()
的出现应为.readLine()
(大写“L”)。
第三,无法完成if (line.equals(w.Contacts(fullName, phoneNo, address)))
部分。您不能通过该对象调用类的构造函数。我想你想要的是if (line.equals(new Contacts(fullName, phoneNo, address)))
,但这仍然是不合适的。您正在尝试比较String
(line
)对象和Contacts
对象。我不知道你想要完成什么,但是你应该在这里比较两个String
或者两个Contacts
。如果您正在尝试这样做,可以尝试line.equals(w.name)
。
第四,每当您从readFile.readLine();
收到错误时,都是因为未被捕获IOException
。我会使用try
- catch
块修复此问题,但方法顶部的throws
修饰符也可以使用。
第五,如果你有String fullName, phoneNo, address;
,那么你应该String fullName = "", phoneNo = "", address = "";
。通过这种方式,您不会因为没有初始化它们而陷入任何编译器错误。
第六,在printName
,deleteName
和main
方法的一行中,您说fullName == namesDB[index]
,这会给您带来运行时错误,因为您正在比较两个具有==
的非原始对象。将其替换为fullName.equals(namesDB[index])
此外,您导入了java.lang.Double
。为什么?首先,自动导入所有java.lang
个文件和包。其次,您不应该使用Double
s,而应使用double
来进行数学运算。此外,您导入了java.util.Arrays
,但从未使用过它。
以下是我解决问题的方法。由于我不知道你想要完成什么,你可能需要稍微调整一下。
import java.util.Scanner;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Contacts
{
String name;
String phone;
String addy;
String[] namesDB = new String[100];
int index = 0;
public Contacts(String fullName, String phoneNo, String address)
{
name = fullName;
phone = phoneNo;
addy = address;
}
public String printName(String fullName)
{
for (index = 0; index < 100; index++)
{
if (fullName.equals(namesDB[index]))
{
System.out.println(namesDB[index]);
}
else
{
index++;
}
}
return namesDB[index];
}
public String deleteName(String fullName)
{
for (index = 0; index < 100; index++)
{
if (fullName.equals(namesDB[index]))
{
namesDB[index] = "0";
System.out.println("Record Deleted.");
}
else
{
index++;
}
}
return namesDB[index];
}
static String stripQuo(String str)
{
if (str.startsWith("\""))
{
str = str.substring(1, str.length());
}
if (str.endsWith("\""))
{
str = str.substring(0, str.length() - 1);
}
return str;
}
public static void main(String[] args)
{
String EMPTY = "Empty";
int index = 0;
String[] namesDB = new String[100];
String fullName = "", phoneNo = "", address = "";
for (int i = 0; i < 100; i++)
{
Contacts w = new Contacts("-1", "-1", "-1");
w.namesDB[i] = EMPTY;
i++;
}
PrintWriter writetoFile = null;
BufferedReader readFile = null;
//Creating Writable File, PCD=Personal Contacts Database
try
{
writetoFile = new PrintWriter(new FileOutputStream("PCDFile.txt"));
readFile = new BufferedReader(new FileReader("PCDFile.txt"));
}
catch (FileNotFoundException ex)
{
System.out.println("Error opening PCDFile.txt");
System.exit(0);
}
catch (IOException gh)
{
System.out.println("Error reading from PCDFile.txt.");
System.exit(0);
}
//ADDING
if (args.length == 1)
{
String option = args[0];
if (option.equals("-a"))
{
for (int i = 0; i < 100; i++)
{
if (namesDB[i].equals(EMPTY))
{
System.out.println("Full Name: ");
Scanner keyboard = new Scanner(System.in);
fullName = keyboard.nextLine();
System.out.println("Phone: ");
phoneNo = keyboard.nextLine();
System.out.println("Address: ");
address = keyboard.nextLine();
Contacts w = new Contacts(fullName, phoneNo, address);
namesDB[i] = "fullName/n" + "phoneNo/n" + "address/n";
writetoFile.println(namesDB[i]);
System.out.println(namesDB[i]);
}
else
{
index++;
}
}
}
//SEARCHING
else
{
option = stripQuo(option);
option = fullName;
String line = "";
try
{
line = readFile.readLine();
}
catch (IOException ex)
{
System.err.println("Could not read line: " + ex);
}
for (index = 0; index < 100; index++)
{
if (line != null)
{
if (line.equals(fullName))
{
Contacts w = new Contacts(fullName, phoneNo, address);
w.printName(fullName);
}
}
else
{
index++;
}
if (index == namesDB.length - 1)
{
System.out.println("No record found for " + fullName + ".");
}
}
}
if (args.length == 2)
{
option = args[0];
fullName = args[1];
Contacts w = new Contacts(fullName, phoneNo, address);
if (option.equals("-s"))
{
fullName = w.stripQuo(fullName);
String line = "";
try
{
line = readFile.readLine();
}
catch (IOException ex)
{
Logger.getLogger(Contacts.class.getName()).log(Level.SEVERE, null, ex);
}
for (index = 0; index < 100; index++)
{
if (line != null)
{
if (line.equals(w.name))
{
w.printName(fullName);
}
}
else
{
index++;
}
if (index == namesDB.length - 1)
{
System.out.println("No record found for " + fullName + ".");
}
}
}
else if (option.equals("-d"))
{
fullName = w.stripQuo(fullName);
String line = "";
try
{
line = readFile.readLine();
}
catch (IOException ex)
{
Logger.getLogger(Contacts.class.getName()).log(Level.SEVERE, null, ex);
}
for (index = 0; index < 100; index++)
{
if (line != null)
{
if (line.equals(w.name))
{
w.deleteName(fullName);
}
}
else if (index == namesDB.length - 1)
{
System.out.println("No record found for " + fullName + ".");
}
else
{
index++;
}
}
}
}
writetoFile.close();
try
{
readFile.close();
}
catch (IOException ex)
{
System.err.println("Could not close file: " + ex);
}
}
}
}
作为一个说明,如果您使用NetBeans,大多数情况都可以避免。你用什么IDE?
答案 3 :(得分:0)
像user512652说的那样拉直你的范围,然后将字符串与.equals()进行比较而不是==