好的,这是源代码 -
程序应该能够运行 a) 如果没有给出参数,则询问带有 args 的文件名 b) 如果有args,获取这些args作为方法'parametr'的参数
问题是,程序可以很好地处理文件输入,但如果参数是从 CMD 或 Eclipse 给出的。从我的角度来看,代码完全没问题,但是 IDK...
//代码块,这会创建一个输出文件+应该处理 //将 args 数组中的整数传递给方法“parametr”
else if (args.length > 0) {
try {
PrintStream ps = new PrintStream("vystup.txt");
for (int i = 0; i < args.length; i++) {
parametr(Integer.parseInt(args[i]));
}
ps.close();
}
catch (Exception g) {
g.printStackTrace();
System.exit(1);
}
}
}
this 指向方法“参数”>>
//该方法应该通过方法//'Posloupnost' 创建一个名为 'pseudoposloupnost' 的数组,然后将此数组复制到名为 'serazenaPosloupnost' 的新数组中 //其余代码并不重要
public static void parametr (int n) {
Posloupnost(n); //Another method to count array 'pseudo...'
serazenaPosloupnost = new int [pseudoposloupnost.length];
for (int k = 0; k < pseudoposloupnost.length; k++) {
serazenaPosloupnost[k] = pseudoposloupnost[k];
}
serazeniPosloupnosti(serazenaPosloupnost);
ps.println(pseudoposloupnost.length + " " + Arrays.toString(pseudoposloupnost));
ps.println(serazenaPosloupnost.length + " " + Arrays.toString(serazenaPosloupnost));
ps.println();
drawPosloupnost();
}
当我尝试使用给定的参数从 CMD 运行代码时,Java 将这两个 block 指向空指针异常。
最佳答案
我认为您有两个名为 ps
的变量。其中一个是您的 try block 的本地变量,另一个(可能)是静态类变量。 “可能”是因为您没有向我们展示其声明。
简化后:
public class myClass {
private static PrintStream ps; // we'll refer to this as "ps1"
public static void parametr(int n) {
...
ps.println("foo");
}
public static void myMethod() {
try {
PrintStream ps =
new PrintStream("x.txt"); // we'll refer to this as "ps2"
parametr(1);
ps.close();
} catch (...) {
}
}
}
这是一个范围的问题。
ps1 和 ps2 是两个不同的变量。
ps1 已定义但从未初始化,因此在整个程序中它的值为 null
。
ps2 位于其周围的 try
block 的本地。它不会传递给 parametr(),因此 parametr() 看不到它。
当 parametr() 执行 ps.println()
时,它会查看 ps1,它为 null,因此会出现 NullPointerException。
解决此问题的一种方法是不创建 ps1,并将 ps2 传递给 parametr():
public class myClass {
public static void parametr(int n, PrintStream printStream) {
...
printStream.println("foo");
}
public static void myMethod() {
try {
PrintStream ps =
new PrintStream("x.txt"); // we'll refer to this as "ps2"
parametr(1, ps);
ps.close();
} catch (...) {
}
}
}
这样做通常很好,因为您可以准确地看到您的方法需要并且可以触及哪些变量。
修复此问题的另一种方法是从 try
block 中的 ps = ...
语句中删除 PrintStream
,这样您就可以分配给类变量。这通常不是一个好主意,因为您向代码的阅读者隐藏了该 PrintStream 的管理。
另一个提示:您调用一个方法 posloupnost(n)
(我将其第一个字母更改为小写,因为 Java 程序员更喜欢这样做)。我可以猜测:
- 这个方法很浪费时间(因为它唯一的参数是一个整数,所以该方法无法改变它)
- 此方法对类变量或全局变量有副作用。
传入将受该方法影响的对象几乎总是更好,以便清楚它将产生什么影响。即使您要打印到屏幕上,最好这样做:
System.out.println(posloupnost(n));
...或...
posloupnost(n, System.out);
关于源代码中的java.lang.nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500407/