| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 802 人关注过本帖
标题:向朋友们请教一个异常错误~@帮帮忙,在线等待@~
只看楼主 加入收藏
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
 问题点数:0 回复次数:10 
向朋友们请教一个异常错误~@帮帮忙,在线等待@~

写一个电话本程序,只存取姓名和号码

写好后,编译可以通过,但当执行这个功能函数时,却遇到一点麻烦

这是整个程序清单:



调用这个输出清单时,可以完成功能,但是后面还出现了这几行提示错误

import java.io.*;
import java.lang.String;


class IndexIterm
{
String name;
String TelNum;
void print()
{
System.out.println(name+" "+TelNum);
}

}

class TelNumList
{
IndexIterm[] tel=new IndexIterm[50];
void add()throws IOException
{
for(int i=0;i<50;i++)
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入电话号码信息");
System.out.print("姓名:");
String Jname = br.readLine();
tel[i]=new IndexIterm();
tel[i].name = Jname;
System.out.print("号码:");
String JTelNum = br.readLine();

tel[i].TelNum = JTelNum;

System.out.print("继续输入吗?(y/n):");

String c = br.readLine();
if(c.equals("y"))
continue;
else if(c.equals("n"))
{
System.out.println("输入成功!请继续使用其他功能!");
return;
}

else
{
System.out.println("必须输入'y'或者'n',请重新输入:");

}

}
}

void IndexOf()throws IOException
{
System.out.print("请输入要查询的姓名:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();

for(int i=0;i<50;i++)
{

if(name.equals(tel[i].name))
{
int r=i+1;
System.out.println("查询结果:");
System.out.println("这是第"+ r +"项信息:"+tel[i].name+" "+tel[i].TelNum);

}
}
}

void IndexOfs()throws IOException
{
System.out.print("请输入要查询的号码:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String Num = br.readLine();

for(int i=0;i<50;i++)
{

if(Num.equals(tel[i].TelNum))
{
int r=i+1;
System.out.println("查询结果:");
System.out.println("这是第"+ r +"项信息:"+tel[i].name+" "+tel[i].TelNum);

}
}
}

void printList()//throws IOException
{
System.out.println("以下是所有号码信息的清单:");

if(tel[0].name.equals(""))
System.out.println("数据库里暂时没有信息,请按'8'输入信息!");

else


for(int i=0;i<50;i++)
{

if(!tel[i].name.equals(""))
{
tel[i].print();
}

else

return;

}

}

void remove()throws IOException
{
System.out.print("请输入要删除的项:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i = Integer.parseInt(br.readLine());

System.out.println("正在处理,请稍后...");
for(int j=i-1;j<50-1;j++)
{
tel[j]=tel[j+1];

}
System.out.println("删除成功!");
}

void SortOfName()throws IOException
{

for(int i=0;i<50-1;i++)
{

int q = i;
for(int j=i+1;j<50;j++)
{
if(!tel[j].name.equals(""))
{
if(tel[q].name.compareTo(tel[j].name)<0)
{
q=j;
}
}
else
{
break;
}
}

if(q!=i)
{
String Lname;
Lname=tel[q].name;
tel[q].name=tel[i].name;
tel[i].name=Lname;
}
}
System.out.println("已排序完毕!");
}

void SortOfNum()throws IOException
{

for(int i=0;i<50-1;i++)
{

int q = i;
for(int j=i+1;j<50;j++)
{
if(!tel[j].TelNum.equals(""))
{
if(tel[q].TelNum.compareTo(tel[j].TelNum)<0)
{
q=j;
}
}
else
{
break;
}
}

if(q!=i)
{
String LNum;
LNum=tel[q].TelNum;
tel[q].TelNum=tel[i].TelNum;
tel[i].TelNum=LNum;
}
}
System.out.println("已排序完毕!");
}

void pringf()throws IOException
{
System.out.print("请输入要查询的序号:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i =Integer.parseInt(br.readLine());
if(!tel[0].name.equals(""))
tel[i-1].print();
else
return;
}

void program()
{
System.out.println(" "+"******************************");
System.out.println(" "+" "+"本程序由李跃制作");
System.out.println(" "+" "+"Emal:daxia841@163.com");
System.out.println(" "+" "+"欢迎交流");
System.out.println(" "+"******************************");
}

int gotos()throws IOException
{
System.out.print("请选择:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
return a;
};

}

public class TelBook
{


public static void main(String[] args)throws IOException
{


TelNumList Q = new TelNumList();
System.out.println("*******************************");
System.out.println(" "+"按1:按姓名查找");
System.out.println(" "+"按2:按号码查找");
System.out.println(" "+"按3:删除号码项");
System.out.println(" "+"按4:查找指定位置的号码");
System.out.println(" "+"按5:按姓名排序");
System.out.println(" "+"按6:按号码排序");
System.out.println(" "+"按7:输出所有号码信息");
System.out.println(" "+"按8:添加新号码信息");
System.out.println(" "+"按9:显示本程序信息");
System.out.println(" "+"按0:退出本程序");
System.out.println("*******************************");
System.out.println();

int b=Q.gotos();


while(true)
{

switch(b)
{
case 1:
Q.IndexOf();
b=Q.gotos();
break;
case 2:
Q.IndexOfs();
b=Q.gotos();
break;
case 3:
Q.remove();
b=Q.gotos();
break;
case 4:
Q.pringf();
b=Q.gotos();
break;
case 5:
Q.SortOfName();
b=Q.gotos();
break;
case 6:
Q.SortOfNum();
b=Q.gotos();
break;
case 7:
Q.printList();
b=Q.gotos();
break;
case 8:
Q.add();
b=Q.gotos();
break;
case 9:
Q.program();
b=Q.gotos();
break;
case 0:
System.out.println("谢谢使用");
return;
}
}


}
}

比如说使用排序功能调用SortOfName();时,会出现这个提示
Exception in thread"main" java.lang.NullPointerException
at TelNumList.printList<TelBook.java:105>
at TelBook.main<Tel.Book.java:287>

在打印清单时,调用pringf();时也会出现同样的提示

请问这是什么问题

帮我下

谢谢~`

[此贴子已经被作者于2006-10-19 19:33:07编辑过]

搜索更多相关主题的帖子: 朋友 在线 
2006-10-19 00:14
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1987
专家分:4
注 册:2006-7-1
收藏
得分:0 
你的是空指针异常,空指针异常是所有异常是最常见的,也是最容易处理的,你只要把你使用的对象都确保初始化了就可以了.
不过新在太晚了,俺要睡觉了!明天改吧!

[shadow=255,red,2]待到秋来九月八,我花开时百花杀。冲天香阵透长安,满城尽是黄金甲。 [/shadow]
2006-10-19 00:25
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 
谢谢你

但是需要怎么改呢?

请说清楚一下.好吗?

有实力才会有魅力 实力来自坚持不懈的努力
2006-10-19 01:34
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

你的那个IndexIterm[] tel=new IndexIterm[50];
这个数组长度是50,你确保它里面的每一个数据都初始化了吗?
如果没有,那么取到它的时候就会抛出空指针异常
void printList()//throws IOException
{
System.out.println("以下是所有号码信息的清单:");

if(tel[0].name.equals(""))
System.out.println("数据库里暂时没有信息,请按'8'输入信息!");

else


for(int i=0;i<50;i++)
{

if(!tel[i].name.equals(""))
{
tel[i].print();
}

else

return;

}

}
它要打出50个所有的信息,并且都用到了这50个对象的引用(红色部份).异常从此抛出
建议:
初学者应该不要先写太难的程序,应该一步一步走,还有,要自己勤于思考
像本题,它抛出异常的时候已经说了是哪一个方法的哪一行出了异常,一找不就找出来了么?
xception in thread"main" java.lang.NullPointerException
at TelNumList.printList<TelBook.java:105>
at TelBook.main<Tel.Book.java:287>
它不是说在TelNumList.printList方法中的第105行吗?
是不是很清楚


可惜不是你,陪我到最后
2006-10-19 09:09
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 

谢谢版主指教

我把改成了这样

for(int i=0;i<50;i++)
{
tel[i]=new IndexIterm();
if(!tel[i].name.equals(""))
{

tel[i].print();
}

else

return;

}

}

为什么还是不行呢?


有实力才会有魅力 实力来自坚持不懈的努力
2006-10-19 15:32
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 
再线等待

有实力才会有魅力 实力来自坚持不懈的努力
2006-10-19 19:26
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
你是在每个函数里都放了new IndexIterm();吗??
现在还出现空指针异常么?

win32汇编
病毒 加密
目前兴趣所在
2006-10-19 20:28
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 

在没个函数放个也不行啊

我把添加号码的函数改了下

void add()throws IOException
{

for(int i=0;i<50;i++)
{
tel[i]=new IndexIterm();
}


for(int i=0;i<50;i++)
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入电话号码信息");
System.out.print("姓名:");
String Jname = br.readLine();


System.out.print("号码:");
String JTelNum = br.readLine();

tel[i].IndexIterms(Jname,JTelNum);



System.out.print("继续输入吗?(y/n):");

String c = br.readLine();
if(c.equals("y"))
continue;
else if(c.equals("n"))
{
System.out.println("输入成功!请继续使用其他功能!");
break;
}

else
{
System.out.println("必须输入'y'或者'n',请重新输入:");

}

}
}

为什么一直不行?

版主..帮帮忙啊~


有实力才会有魅力 实力来自坚持不懈的努力
2006-10-19 21:33
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
比如这个方法
void IndexOf()throws IOException
{
System.out.print("请输入要查询的姓名:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();

for(int i=0;i<50;i++)
{

if(name.equals(tel[i].name)){
/*这句你把输入的name和数组里的50个name比较,如果数组里面没存储任何的值,则你和50个null比较,当然会出空指针异常了*/
int r=i+1;
System.out.println("查询结果:");
System.out.println("这是第"+ r +"项信息:"+tel[i].name+" "+tel[i].TelNum);

}
}
}
好好安排你的程序的逻辑来解决这些情况
建议你学学java处理数据结构的类,比用数组好的多

win32汇编
病毒 加密
目前兴趣所在
2006-10-19 21:50
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 

版主.谢谢了

经过你的提示

我修改了下..

int m = 0;

static IndexIterm[] tel=new IndexIterm[50];

void add()throws IOException
{

for(int i=0;i<50;i++)
{
tel[i]=new IndexIterm();
}

while(m<50)
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入电话号码信息");
System.out.print("姓名:");
String Jname = br.readLine();


System.out.print("号码:");
String JTelNum = br.readLine();

tel[m].IndexIterms(Jname,JTelNum);

m++;

System.out.print("继续输入吗?(y/n):");

String c = br.readLine();
if(c.equals("y"))
continue;
else if(c.equals("n"))
{
System.out.println("输入成功!请继续使用其他功能!");
break;
}

else
{
System.out.println("必须输入'y'或者'n',请重新输入:");

}

}
}

用了一个m控制下标..成功了~~


有实力才会有魅力 实力来自坚持不懈的努力
2006-10-19 22:20
快速回复:向朋友们请教一个异常错误~@帮帮忙,在线等待@~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034651 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved