Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
源代码中的Java.lang.nullpointer异常_Java_Arrays_Nullpointerexception - Fatal编程技术网

源代码中的Java.lang.nullpointer异常

源代码中的Java.lang.nullpointer异常,java,arrays,nullpointerexception,Java,Arrays,Nullpointerexception,好的,这是源代码- 程序应该能够运行a)如果没有给出参数,请输入带有args的文件名 b) 如果存在参数,请将这些参数作为“parametr”方法的参数获取 问题是,程序可以很好地处理文件输入,但如果参数是由CMD或Eclipse提供的。从我的角度来看,代码是完全好的,但IDK //代码块,它创建一个输出文件+该文件 //在args数组的方法“parametr”的整数上 else if (args.length > 0) { try {

好的,这是源代码-

程序应该能够运行a)如果没有给出参数,请输入带有args的文件名 b) 如果存在参数,请将这些参数作为“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);
                }

            }
        }
else if(args.length>0){
试一试{
PrintStream ps=新的PrintStream(“vystup.txt”);
对于(int i=0;i
这指向一个方法“parametr”>>

//此方法只需通过方法//“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();

    }
publicstaticvoid参数(intn){
Posloupnost(n);//计算数组“pseudo…”的另一种方法
serazenaPosloupnost=newint[pseudoposloupnost.length];
对于(int k=0;k

当我尝试使用给定的参数从CMD运行代码时,Java将这两个块作为空指针异常指向。

我认为您有两个名为
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,ps1为null,因此出现NullPointerException

解决此问题的一种方法是不创建ps1,并将ps2传递到parametr()

一般来说,这样做很好,因为您可以准确地看到您的方法需要哪些变量,并且可以触及哪些变量

另一种解决方法是从
try
块中的
ps=…
语句中删除
PrintStream
,这样您就可以分配给类变量。这通常不是一个好主意,因为您对代码的读者隐藏了对该打印流的管理


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

  • 此方法浪费时间(因为它唯一的参数是整数,所以该方法无法更改)
  • 此方法对类变量或全局变量有副作用
传递将受该方法影响的对象几乎总是更好的,这样可以清楚地知道它将产生什么影响。即使要在屏幕上打印,也最好执行以下操作:

系统输出println(posloupnost(n))

。。。或者


posloupnost(n,系统输出)

参数使用的是什么数组(例如什么是
pseudoposloupnost
serazenaPosloupnost
?)以及原因?如果某些内容为空,请查看堆栈跟踪中的行号。1)要更快获得更好的帮助,请发布一个。2) 始终复制/粘贴错误和异常输出。
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 (...) {
         }
    }
}