好的,这是源代码-

该程序应该能够运行a)如果未提供任何参数,则使用args询问文件名
                                  b)如果有参数,请将这些参数作为方法“ parametr”的参数

问题是,程序可以在文件输入中正常工作,但是如果args是从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);
                }

            }
        }


这指向方法“参数” >>

//此方法应该只通过方法'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将这两个块作为nullpointer异常指向。

最佳答案

我认为您有两个名为ps的变量。其中一个是您try块的局部变量,另一个是(可能是)静态类变量。 “可能”是因为您没有向我们展示其声明。

简化下来:

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块而言是本地的。它没有传递给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 (...) {
         }
    }
}


通常做这种事情是很好的,因为您可以确切地看到方法需要和可以触摸的变量。

解决该问题的另一种方法是从PrintStream块的ps = ...语句中删除try,因此将其分配给class变量。这通常不是一个好主意,因为您对代码阅读器隐藏了该PrintStream的管理。



另一个技巧:调用方法posloupnost(n)(我将其首字母更改为小写,因为Java程序员更喜欢这样做)。我可以猜测:


该方法很浪费时间(因为它的唯一参数是整数,所以该方法不能更改它)
此方法对类变量或全局变量有副作用。


传递总是会受到该方法影响的对象几乎总是比较好,这样可以清楚知道它将产生什么效果。即使您要在屏幕上打印,也最好这样做:

System.out.println(posloupnost(n));

... 要么 ...

posloupnost(n,System.out);

关于java - 源代码中的Java.lang.nullpointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20500407/

10-12 00:29
查看更多