有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组Java。源代码中的lang.nullpointer异常

好的,这是源代码-

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

            }
        }

这指向一个“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();

    }

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


共 (1) 个答案

  1. # 1 楼答案

    我认为有两个变量叫做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 (...) {
             }
        }
    }
    

    一般来说,这样做很好,因为你可以准确地看到你的方法需要什么样的变量,也可以接触到什么样的变量

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


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

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

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

    系统。出来println(posloupnost(n))

    。。。或者

    posloupnost(n,System.out)