尝试在 Linux 上打开文件时出现 Java Nullpointer 异常

标签 java linux

对于我的一门类(class),我需要编写一个 Java 套接字小程序。

我要展示的这部分代码已经给出,无需进行任何更改,并且已确认可以在 Windows 机器上运行。

但是我无法让它在我的 Linux 机器(Mint 18.3)上运行

package bank;

import java.io.BufferedReader;


import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

public class RunClient extends JFrame {
    private static final long serialVersionUID = 9104605361596820718L;

    private static JFrame frame;

    public static void main(String args[]) {
        frame = new RunClient();
        frame.pack();
        frame.setVisible(true);
    }

    private RunClient() {
        super("Choose Bank Driver");
        Vector<String> vect = new Vector<>();

        try {
            URL url = this.getClass().getResource("/Servers.txt");
            URI uri = url.toURI();
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(uri.getPath())));
            String line = in.readLine();
            while (line != null) {
                vect.add(line);
                line = in.readLine();
            }
            in.close();
        } catch (Exception e) {
        }

        final JList<String> list = new JList<>(vect);
        list.setVisibleRowCount(Math.max(10, Math.min(30, vect.size())));

        add(new JScrollPane(list));
        JButton b = new JButton("start");
        add(b, "South");
        b.addActionListener(e -> startBank(list.getSelectedValue()));
    }

    private void startBank(String arg) {
        frame.setVisible(false);
        frame.dispose();

        StringTokenizer tok = new StringTokenizer(arg);
        String[] args = new String[tok.countTokens()];
        for (int i = 0; i < args.length; i++) {
            args[i] = tok.nextToken();
        }
        Client.main(args);
    }

}

调试后我发现这一行给我一个空指针异常。

URL url = this.getClass().getResource("/Servers.txt");

它在 Windows 机器上运行良好,是的,我的文件存在并且我有权读取它。

Folder structure

最佳答案

当您使用 getResource() 时,您将获得相对于类路径的资源。这意味着要正常工作,您的资源需要类路径中。

如果将 resources 文件夹添加到类路径中,您将能够访问 Servers.txt

或者,将 Servers.txt 移动到 java 文件夹或使用文件 File 或文件 URLFileInputStream 直接访问文件,而不是通过类路径。

顺便说一句,URL url = this.getClass().getResource("/Servers.txt"); 这行不太可能给你一个 NullPointerException。它将是它之后的一行: URI uri = url.toURI(); 你在其中取消引用 url ,它有一个空值,因为 getResource() 在类路径中找不到资源时返回 null

关于尝试在 Linux 上打开文件时出现 Java Nullpointer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48886871/

相关文章:

java - Hibernate 架构在部署时自动删除

ruby-on-rails - 如何运行sqlplus centOS?

Java - 暂停 initComponents 运行?

java - 如何解决无法在 Maven 项目中内省(introspection)测试类的警告?

java - 静态类中的线程安全和泛型

c - 从 C 执行程序

linux - 如何在 2-3 行匹配模式之前插入一行

c++ - 将 C++ 代码从 MS Visual Studio 移植到 Linux 并处理类型化枚举

linux - 正确的用户输入 - x86 Linux 程序集

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?