繁体   English   中英

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

[英]Java Nullpointer exception while trying to open file on linux

对于我的课程之一,我需要编写一个Java套接字小程序。

我将要展示的部分代码已经给出,无需进行任何更改,并且可以在Windows计算机上正常工作。

但是我无法使其在我的Linux机器上工作(薄荷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);
    }

}

调试之后,我发现此行给了我一个nullpointer异常。

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

它在Windows机器上可以正常工作,是的,我的文件存在,并且我有权读取它。

资料夹结构

使用getResource()您将获得相对于类路径的资源。 这意味着要工作,您的资源必须位于类路径上。

如果将resources文件夹添加到类路径,则可以访问Servers.txt

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

顺便说一下, URL url = this.getClass().getResource("/Servers.txt");不太可能是URL url = this.getClass().getResource("/Servers.txt"); 这为您提供了NullPointerException 它将是其后的行: URI uri = url.toURI(); 您在其中取消引用具有null值的url ,因为getResource()在类路径上找不到资源时会返回null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM