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

标签 java nullpointerexception ubuntu-15.04

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

Machine: Ubuntu-14.04 LTS
JDK: JDK-8 (Java EE application)
Webserver: Apache Tomcat

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

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)

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

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();
        }
    }
}

类Attempt的主要方法中实现此方法。

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

抛出编译错误:

devkrishna@krishna:~/Desktop/Java/project1$ javac project1.java
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
project1.java:85: error: ']' expected
                Root op[i]=new Root();
                    ^
project1.java:85: error: illegal start of expression
                Root op[i]=new Root();
                     ^
2 errors

最佳答案

您正在初始化 Root 数组,但未初始化其元素。

对于每个 i

op[i].get 将为 null,并且调用其上的任何方法都会抛出 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());

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

关于java - 由于空指针异常导致运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32589512/

相关文章:

java - 即使使用线程安全实现,如何修复异步java代码失败的问题?

java - 模板方法调用 super 并使用实现

Java - 循环LinkedhashMap并获取值

Linux 路径/依赖关系处理

java - 在@FunctionalInterface 中处理可变参数的更简洁方法?

android - ProgressDialog 的自定义对话框问题

java - 什么是NullPointerException,我该如何解决?

java - java GC 是否考虑在另一个线程中进行的引用?

installation - 在 Ubuntu 15.04 上安装 Genymotion 2.6.0

python - 使 .py 文件在 ubuntu 15.04 中可执行