A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王_强 中级黑马   /  2013-3-23 18:10  /  1934 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.io.properties;

import java.io.*;
import java.util.*;

/*
* 用于记录应用程序运行的次数
* 如果使用次数已到,那么给出注册提示
*  很容易想到的是计数器
*  可以该计数器定义在程序中,随着程序的运行而在内存中存在,
*  并进行自增,可是随着该应用程序的退出,该计数器在内存中消失
*  下次再启动该程序时,又重新开始重0开始
*  
*  程序即使结束,该计数器的值也存在
*  下次程序启动时,会先在该计数器的值并加上1后重新存储起来
*  所以要建立一个配置文件,用于记录该软件的使用次数
*  
*  键值对数据是map集合
*  数据是以文件的形式存储,使用io
*  那么map+io->properties
*  配置文件可以实现应用程序数据的共享
*
* */

public class PropertiesTest2 {

        /**
         * @param args
         * @throws FileNotFoundException
         */
        public static void main(String[] args){
          
                Properties prop=new Properties();
                FileOutputStream fos=null;
                FileInputStream fis=null;
                File file=new File("count.ini");
            
            
            if(!file.exists())
                        try {
                                file.createNewFile();
                                  fis=new FileInputStream(file);
                               
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
            int count=0;   
            try {       
                        prop.load(fis);
                } catch (IOException e) {
                        e.printStackTrace();
                }
            
            String value=prop.getProperty("time");
            
            if(value!=null){
                    count=Integer.parseInt(value);
                    if(count>5)
                            System.out.println("你好,请缴费");       
                    return ;
            }            
            count=count+1;   
            prop.setProperty("time", count+"");
  
                try {
                           fos = new FileOutputStream(file);
                           prop.store(fos, "fdf");
                            fos.close();
                            fis.close();   
                } catch (Exception e) {
                        e.printStackTrace();               
                }
        }
}


Exception in thread "main" java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Properties.java:418)
        at java.util.Properties.load0(Properties.java:337)
        at java.util.Properties.load(Properties.java:325)
        at com.io.properties.PropertiesTest2.main(PropertiesTest2.java:50)

求高手指点;上面的程序我是按毕老师的视频敲得,为什么我的报异常?

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-24 08:11

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 blackcaismine 于 2013-3-23 18:42 编辑

第一次创建文件的时候没问题,但是第二次执行时,你的fis指向null,然后判断文件存在后直接prop.load(fis)了,
所以会出现空指针异常。
在prop.load(fis);前面加上fis=new FileInputStream(file);载入文件 就不会出现这个问题了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴上波 于 2013-3-23 18:45 编辑

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesTest {

        /**
         * @param args
         * @throws FileNotFoundException
         */
        public static void main(String[] args) throws IOException {

                Properties prop = new Properties();
                FileOutputStream fos = null;
                File file = new File("count.ini");
                FileInputStream fis = null;

                if (!file.exists())
                        try {
                                file.createNewFile();

                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                fis = new FileInputStream(file);   //这句代码应该放在try/catch块外面,否则如果文件存在,fis则指向null,prop.load(fis)也为null,则会报空指针错误
                int count = 0;
                try {
                        prop.load(fis);
                } catch (IOException e) {
                        e.printStackTrace();
                }

                String value = prop.getProperty("time");

                if (value != null) {
                        count = Integer.parseInt(value);
                        if (count > 5)
                                System.out.println("你好,请缴费");
                        
                }
                count = count + 1;
                prop.setProperty("time", count + "");

                try {
                        fos = new FileOutputStream(file);
                        prop.store(fos, "fdf");
                        fos.close();
                        fis.close();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 曹睿翔 于 2013-3-23 19:10 编辑

用代码添加没法标记文字(版主见谅),就直接贴上来了,帮你加了少部分注解,希望能帮到你,一个是楼上说的那个问题,一个是{}没加,一个是close的位置不对。

public static void main(String[] args){

                Properties prop=new Properties();
                FileOutputStream fos=null;
                FileInputStream fis=null;
                File file=new File("c:"+File.separator+"count.txt");//第一次最好用txt,这样运行一次你可以查查count到底写进文件没


            if(!file.exists())//判断File封装的文件是否存在,不存在则创建!
                        try {
                                file.createNewFile();

                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }         

            try {
                                fis=new FileInputStream(file);//这个问题上边已经指出,就不多说了
                        } catch (FileNotFoundException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                        }

            int count=0;

            try {        
                        prop.load(fis);
                } catch (IOException e) {
                        e.printStackTrace();
                }

            String value=prop.getProperty("time");

            if(value!=null){
                    count=Integer.parseInt(value);
                    if(count>5){
                            System.out.println("你好,请缴费");        
                         return ;//这个地方你没在if语句加{},导致直接跳出外if语句,这也导致了下边的语句,count++等没有执行!!所以根本没写进去文件,也没关流
                            }
            }            
            count++;   
            System.out.println( count);
            prop.setProperty("time", count+"");

                try {
                           fos = new FileOutputStream(file);
                           prop.store(fos, "fdf");


                } catch (Exception e) {
                        e.printStackTrace();  

                }finally{//关流应该在finally块内执行,还要判断两个流是否为null
                         try {
                                      if(fos!=null)
                                      fos.close();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();

                                        }
                     try {
                                              if(fis!=null)
                                                fis.close();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }  
                }


        }
}
                         try {
   if(fos!=null)
  fos.close();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();

                                        }
                     try {
                                            if(fis!=null)
                                                fis.close();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }  
                }


        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马