由于空指针异常导致的运行时错误

时间:2015-09-15 15:07:00

标签: java nullpointerexception ubuntu-15.04

我在我的Linux机器Ubuntu 14.04上编程。其他技术规范是:

  

机器: Ubuntu-14.04 LTS
   JDK: JDK-8(Java EE应用程序)
   Webserver: Apache Tomcat

下面给出的Java代码会抛出空指针异常。错误消息如下所示:

someCmd

第85行将是(op [i] .get();)

devkrishna@krishna:~/Desktop/Java/project1$ java attempt
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
Exception in thread "main" java.lang.NullPointerException
    at attempt.main(project1.java:85)

import java.io.*; import java.util.*; import java.lang.NullPointerException; class Root{ public int no=0; public String bookNo; public String book; public String author; RandomAccessFile outs; public void get(){ try{ DataInputStream in = new DataInputStream(System.in); System.out.println("\n"); System.out.print("Enter book no. : "); bookNo = in.readLine(); no = Integer.parseInt(bookNo); System.out.print("Enter the book name: "); book = in.readLine(); System.out.print("Enter author's name: "); author = in.readLine(); } catch(IOException e){ System.out.println("I/O EXCEPTION !!!"); System.exit(1); } } public void processFile(){ try{ outs = new RandomAccessFile("output.dat","rw"); outs.seek(outs.length()); outs.writeBytes(bookNo); outs.writeBytes("\t \t \t"); outs.writeBytes(book); outs.writeBytes("\t \t \t"); outs.writeBytes(author); outs.writeBytes("\n"); outs.close(); } catch(IOException e){ System.out.println("FILE I/O ERROR !!!"); } } public void tell(){ try{ System.out.println("\n"); System.out.println("Book no. : " + bookNo); System.out.println("Book name: " + book); System.out.println("Author: " + author); System.out.println("\n"); } catch(Exception e){ System.out.println("EXCEPTION !!!"); } } } class attempt{ public static void main(String[] args){ Root op[] = new Root[5]; for(int i=0;i < 5; i++){ op[i].get(); op[i].processFile(); op[i].tell(); } } }

的主要方法中实现此方法
class Attempt

抛出编译错误:

for(int i=0;i < 5; i++){
    op[i] = new Root(); // here
    op[i].get();
    op[i].processFile();
    op[i].tell();
}

1 个答案:

答案 0 :(得分:4)

您正在初始化Root数组而不初始化其元素。

对于每个op[i].get

null将为i,并且在其上调用任何方法将引发NullPointerException

一个简单的习语是:

for(int i=0;i < 5; i++){
    op[i] = new Root(); // here
    op[i].get();
    op[i].processFile();
    op[i].tell();
}

一个丑陋的内联替代方案是:

Root op[] = new Root[]{new Root(),new Root(),new Root(),new Root(),new Root()};

另一个丑陋的内联替代方案:

Root[] op = {new Root(),new Root(),new Root(),new Root(),new Root()};

最后,java.util.Arrays类有一个更漂亮的fill方法:

Root op[] = new Root[5];
java.util.Arrays.fill(op, new Root());

但是,这将使用相同的实例填充您的数组,而不是每个元素一个实例,这可能不是您想要的结果。

相关问题