在seek时使用RandomAccesssFile的NullPointerException

时间:2014-10-04 18:47:06

标签: java nullpointerexception seek randomaccessfile

我想介绍有关汽车的信息并将其保存在文件中。 我的问题是,当我引入数据时,它显示我发生了一个NullPointerException,我使用" seek"将指针放在我想要的位置。

我有一个Java类,我用它来询问用户他想要使用什么操作,目前只添加汽车的数据;以及我想在同一个

中创建的文件中写汽车数据的其他地方
package Tema1AccesoAleatiroFicheros;

import java.io.IOException;
import java.util.Scanner;


public class Vista {

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

    Scanner sc=new Scanner(System.in);

    Controlador coche=new Controlador();

    System.out.println("Eliga opción:");
    System.out.println("1-Ingresar coche:");
    System.out.println("2-Modificar registro:");
    System.out.println("3-Salir.");
    int opcion=sc.nextInt();

    Controlador.crearFichero();

    while (opcion!=3)
    {
        switch(opcion)
        {
            case 1:
                añadir();
                break;
            case 2:
                modificar();
                break;
        }

    System.out.println("Eliga opción:");
    System.out.println("1-Ingresar coche:");
    System.out.println("2-Modificar registro:");
    System.out.println("3-Salir.");
    opcion=sc.nextInt();

    }

}

public static void añadir ()
{
    Scanner sc=new Scanner(System.in);

    String[] array=new String[7];

    System.out.println("Introduzca código:");
    String cod=sc.next();
    System.out.println("Introduzca marca:");
    String marca=sc.next();
    System.out.println("Introduzca modelo:");
    String modelo=sc.next();
    System.out.println("Introduzca matricula:");
    String matricula=sc.next();
    System.out.println("Introduzca potencia en caballos:");
    int potencia=sc.nextInt();
    System.out.println("Introduzca número de plazas:");
    int plazas=sc.nextInt();
    System.out.println("Introduzca número de puertas:");
    int puertas=sc.nextInt();

    array[0]=cod;
    array[1]=marca;
    array[2]=modelo;
    array[3]=matricula;
    array[4]=Integer.toString(potencia);
    array[5]=Integer.toString(plazas);
    array[6]=Integer.toString(puertas);

//        array[3]=new String(cod);
//        array[1]=new String(marca);
//        array[2]=new String(modelo);
//        array[3]=new String(matricula);
//        array[4]=new String(Integer.toString(potencia));
//        array[5]=new String(Integer.toString(plazas));
//        array[6]=new String(Integer.toString(puertas));

    Controlador.añadirCoche(array);
}

public static void modificar ()
{
    Scanner sc=new Scanner(System.in);

    System.out.println("Introduzca código:");
    String codigo=sc.next();

//        if(Controlador.buscarRegistro(codigo)!=-1)
    {
//            int pos=Controlador.buscarRegistro(codigo);

        System.out.println("Introduzca código:");
        String cod=sc.next();
        System.out.println("Introduzca marca:");
        String marca=sc.next();
        System.out.println("Introduzca modelo:");
        String modelo=sc.next();
        System.out.println("Introduzca matricula:");
        String matricula=sc.next();
        System.out.println("Introduzca potencia en caballos:");
        int potencia=sc.nextInt();
        System.out.println("Introduzca número de plazas:");
        int plazas=sc.nextInt();
        System.out.println("Introduzca número de puertas:");
        int puertas=sc.nextInt();

        Modelo mod=new Modelo(cod,marca,modelo,matricula,potencia,plazas,puertas);

//            Controlador.setCoche(pos, mod);
    }

}

}

$

package Tema1AccesoAleatiroFicheros;

import static Tema1AccesoAleatiroFicheros.Controlador.direccion;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Controlador {

static String direccion="C:\\Users\\Noneking2\\Desktop\\prueba.dat";
public static RandomAccessFile flujo;
private static int numRegistros=0;
private static int tamRegistro=7;

public static void crearFichero ()
{
    File comprobar=new File(direccion);
    if(!comprobar.exists())
    {
        try 
        {
            File fichero=new File(direccion);
            RandomAccessFile random=new RandomAccessFile(fichero,"rw");
//                FileOutputStream fileout=new FileOutputStream(fichero);
        } 
        catch (FileNotFoundException ex) 
        {
            Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

public static void añadirCoche (String [] array)
{
    try 
    {
        flujo.seek(numRegistros*tamRegistro);
    }
//        catch (NullPointerException n)
//        {
//            System.out.println("NullPointerException success");
//        }
    catch (IOException ex) 
    {
        Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
    }

    for(int i=0;i<array.length;i++)
    {
//            try 
//            {
//                flujo.writeUTF(array[i]);
//            } 
//            catch (IOException ex) 
//            {
//                Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
//            }
    }
    numRegistros++;
}

}

1 个答案:

答案 0 :(得分:0)

您获得空指针异常的原因是您永远不会为flujo分配值,因此它在您声明它时仍为空。

RandomAccessFile flujo;
                      ^ no value is being assigned

基本相同
RandomAccessFile flujo = null;

由于它始终为null,因此从对象调用方法会引发错误。

此外,以下代码不会对程序产生任何影响(除非抛出异常),因为一旦退出try-catch块,这些变量将被垃圾回收器整理并删除。您可能希望在块外或类内初始化它们。

    try 
        {
            File fichero=new File(direccion);
            RandomAccessFile random=new RandomAccessFile(fichero,"rw");
             // FileOutputStream fileout=new FileOutputStream(fichero);
        } 

了解变量范围here