首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

txt中自个儿敲入字符,程序就会报错

2013-10-14 
txt中自己敲入字符,程序就会报错package Bbstreeimport java.io.*import java.util.HashMapimport java

txt中自己敲入字符,程序就会报错

package Bbstree;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class Tree {

TreeNode trnode[];
public static void main(String[] args) {
// TODO Auto-generated method stub
String allword=null,buffword; //保存单个单词
String sentense[]=null;//读取整个字符串,tree用来实现二叉树
int length,a,dep=0;
TreeNode tnodebuf,thead;
try
{
String encoding="UTF-8";
File file = new File("D://test_2.txt");    //file 指向目录中的文件
if(file.isFile() && file.exists())
{ //判断文件是否存在
           InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到汉子编码格式          
           BufferedReader br =new BufferedReader(read);       
           allword=br.readLine();    //读取文件中的一行数据
           length=allword.length();    //获得字符串s1的长度并赋值给length_1
           read.close();
}

else{
   System.out.println("找不到指定的文件");
}
}
catch(Exception e){
System.out.println("读取文件内容出错");
e.printStackTrace();
}
if(allword!=null)
{
sentense=allword.split(" ");
}
TreeNode trnode[]=new TreeNode[sentense.length];
for(int i=0;i<sentense.length;i++)
{
trnode[i]=new TreeNode(sentense[i]);

}
for(int i=0;i<sentense.length;i++)
for(int j=0;j<sentense.length-i-1;j++)
{
if(trnode[j].length>trnode[j+1].length)
{
tnodebuf=new TreeNode(sentense[i]);
tnodebuf.NodeCopy(trnode[j]);
trnode[j].NodeCopy(trnode[j+1]);
trnode[j+1].NodeCopy(tnodebuf);
}
}
thead=new TreeNode();
thead.pos=(0+sentense.length)/2;
int depth=Creatbtree(trnode,0,sentense.length-1,0,sentense.length,dep);
TreeNode netree[]=new TreeNode[sentense.length];
for(int i=0;i<sentense.length;i++)
{
netree[i]=new TreeNode();
}
int nelength=FindAcctimes(trnode,netree,sentense.length);
wordsort(netree,nelength-1);
fiwrite(netree,depth,nelength-1);
}
//trnode保存二叉树,netree保存出现次数,以及去除了相同的字符串
private static int Creatbtree(TreeNode trnode[],int pos1,int pos2,int i,int length,int dep)
{//递归简历平衡排序二叉树
int dep1,dep2;
dep++;

if(pos1<=pos2)
{
if(pos1==pos2)
{
trnode[(pos1+pos2)/2].lchild=-1;
trnode[(pos1+pos2)/2].rchild=-1;
trnode[(pos1+pos2)/2].pos=dep;
}
else if((pos1+pos2)/2==pos1)
{
trnode[(pos1+pos2)/2].lchild=-1;
trnode[(pos1+pos2)/2].rchild=(pos2+(pos1+pos2)/2+1)/2;
trnode[(pos1+pos2)/2].pos=dep;
}
else
{
trnode[(pos1+pos2)/2].lchild=(pos1+(pos1+pos2)/2-1)/2;
trnode[(pos1+pos2)/2].rchild=(pos2+(pos1+pos2)/2+1)/2;
trnode[(pos1+pos2)/2].pos=dep;
}

dep1=Creatbtree(trnode,pos1,(pos1+pos2)/2-1,i,length,dep);
dep2=Creatbtree(trnode,(pos1+pos2)/2+1,pos2,i,length,dep);
dep=((dep1>dep2)?dep1:dep2)>dep?((dep1>dep2)?dep1:dep2):dep;//得出深度


}
return dep;
}
private static int FindAcctimes(TreeNode trnode[],TreeNode treenode[],int length)
{
//找出每个单词出现次数并去除同样字符串

int tnum=0,relength=length;
Map<String, String> existMap = new HashMap<String, String>();
for(int i=0;i<length;i++)//将数据存入一个数组,有相同字符串ACCTIMES就+1
{

if(existMap.get(trnode[i].treenode)==null)//字符串不存在
 {
 existMap.put(trnode[i].treenode,Integer.toString(trnode[i].acctimes));
 treenode[tnum].NodeCopy(trnode[i]);
tnum++;
 }
else if(existMap.get(trnode[i].treenode)!=null)//字符串已存在
{
existMap.put(trnode[i].treenode,Integer.toString(trnode[i].acctimes+1));
relength--;
}
}
for(int i=0;i<length;i++)
{//存入出现次数
try
{
treenode[i].acctimes=Integer.valueOf(existMap.get(treenode[i].treenode)).intValue();
}
catch(Exception e){}
}
return length;
 
}
private static void fiwrite(TreeNode trnode[],int dep,int length)
{
try
{
File file = new File("D://test_1.txt");
FileWriter fw_clear = new FileWriter(file);
BufferedWriter bw_clear = new BufferedWriter(fw_clear);
bw_clear.write("");
bw_clear.close();
}
catch(Exception e){}
try
{
File file = new File("D://test_1.txt");
FileWriter fw = new FileWriter(file,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("深度为:"+dep);


bw.newLine();
for(int i=0;i<length-1;i++)
bw.write(trnode[i].treenode+":"+trnode[i].acctimes+";   ");
bw.close();
}
catch(Exception e){}
}
private static void wordsort(TreeNode treenode[],int length)
{
TreeNode bufnode=new TreeNode();
for(int i=0;i<length-1;i++)
for(int j=0;j<length-i-2;j++)
{
if(treenode[j].treenode.codePointAt(0)>treenode[j+1].treenode.codePointAt(0))
{
bufnode=new TreeNode();
bufnode.NodeCopy(treenode[j]);
treenode[j].NodeCopy(treenode[j+1]);
treenode[j+1].NodeCopy(bufnode);
}
}
}
}



Exception in thread "main" java.lang.NullPointerException
at Bbstree.Tree.wordsort(Tree.java:166)
at Bbstree.Tree.main(Tree.java:66)

如果我自己从网页中复制东西粘贴的txt中,程序运行正常,但是要是在txt中进行操作,比如加进空格字符什么的,就会这样报错。
java txt
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

应该是编码的问题、、网页上应该是utf-8的而windows默认的是gbk、楼主可以试试我个人觉得应该是 这个问题
具体怎么操作呢?


把test_2.txt改成UTF-8格式保存或者把程序中的encoding改成GBK。

没有用 
如下报错
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.codePointAt(Unknown Source)
at Bbstree.Tree.wordsort(Tree.java:168)
at Bbstree.Tree.main(Tree.java:67)


我的txt文本是这样的 i am a student is pig is pig gos nit
在里面接着输入之前没有出现过的单词,程序可以继续运行,但是输入的单词有重复就会这样报错,比如这样i am a student is pig is pig gos nit hehe ni cai wo sh ni  cai


你的TreeNode介意发出来吗?我本地跑一下。
[解决办法]
上面的说法有点问题,重新发一下:
测试了一下,主要是"i am a student is pig is pig gos nit hehe ni cai wo sh ni  cai", ni和cai之间多了个空格,所以导致有""空字符串出现,导致在wordsort的treenode[j].treenode.codePointAt(0)会报StringIndexOutOfBoundsException异常。所以如果你需要对空字符串""也要排序的话,先要判断一下作另外的处理。或者你想要出现多个空格当一个空格进行分隔的,可以使用正则表达式,如:allword.split("\\s+");
[解决办法]
你读的时候用指定编码集的方式读试试,也就是
InputStreamReader ir = new InputStreamReader(in, "utf-8");也可以指定是你的是window系统的话字符集默认是gbk的所有你用“UTF_8”读出来试试,这样可以理解吧?

热点排行
Bad Request.