源代码中的java.lang.nullpointerException

标签 java arrays nullpointerexception

好的,这是源代码 -

程序应该能够运行 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/

相关文章:

java - 如何在 Logback 中为整个应用程序/JVM 设置类似 MDC 的变量?

javascript - 映射两个数组以将不同数据合并到一个 IF 中 javascript 中的项目 id 相同

java - 从文件中读取数据到数组中,然后将数据输出到另一个文件中

c++ - 是否可以重载一个可以从指针中分辨出固定数组的函数?

java - Swing 空指针

java - 通过套接字接收的字符串在 python 中不进行比较

java - TreeViewer 选择和剪贴板

java - 单独线程中的屏幕捕获导致 Java 应用程序缓慢/无响应

java - 将字符串数组从容器 Activity 传递到 fragment 时,getArguments() 返回 null

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