我在我的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();
}
答案 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());
但是,这将使用相同的实例填充您的数组,而不是每个元素一个实例,这可能不是您想要的结果。