对于我的一门类(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 机器上运行良好,是的,我的文件存在并且我有权读取它。
最佳答案
当您使用 getResource()
时,您将获得相对于类路径的资源。这意味着要正常工作,您的资源需要在类路径中。
如果将 resources
文件夹添加到类路径中,您将能够访问 Servers.txt
。
或者,将 Servers.txt
移动到 java
文件夹或使用文件 File
或文件 URL
或 FileInputStream
直接访问文件,而不是通过类路径。
顺便说一句,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/