Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 NullPointerException问题_Java_Exception - Fatal编程技术网

Java NullPointerException问题

Java NullPointerException问题,java,exception,Java,Exception,我正在尝试实现以下代码,但遇到了一个问题,即对非静态方法的静态引用 public class App { public static void main (String args[]) { int result = factorial(5); System.out.println(result); } private int factorial(int value) { if (value == 0) return 1; int s

我正在尝试实现以下代码,但遇到了一个问题,即对非静态方法的静态引用

public class App {
  public static void main (String args[]) { 
    int result = factorial(5);
    System.out.println(result);
  }

  private int factorial(int value) {

    if (value == 0) 
      return 1;
    int sum = value * factorial(value-1);
    return sum;

  } 
}
运行上述代码,我得到以下错误:

Error: Cannot make a static reference to the non-static method factorial() from the type App
如果从main方法中删除static关键字,则会得到一个NullPointerException错误堆栈:

java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at 
edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
我不太确定如何解决这个问题,非常感谢您的帮助


编辑:调用阶乘方法时,我忘记了包含一个参数,很抱歉,它现在已修复。

必须有一个现有的
静态main
方法。它会被寻找,当你找不到它时,这就是你收到的错误


您可以通过将
factorial
设置为静态方法来解决特定问题。

必须存在一个现有的
静态main
方法。它会被寻找,当你找不到它时,这就是你收到的错误


您可以通过使
factorial
成为一个静态方法来解决您的特定问题。

您正在调用
factorial
-一个实例成员形成一个静态方法
main
,这就是错误出现的原因。您可以将
factorial
声明为解决此问题的静态方法

public class App {
    public static void main(String args[]) {
        int result = factorial(5); // you need to pass a int value here
        System.out.println(result);
    }

    private static int factorial(int value) {
        if (value == 0)
            return 1;
        return value * factorial(value - 1);

    }
}

您正在调用
factorial
-一个静态方法
main
的实例成员,这就是错误出现的原因。您可以将
factorial
声明为解决此问题的静态方法

public class App {
    public static void main(String args[]) {
        int result = factorial(5); // you need to pass a int value here
        System.out.println(result);
    }

    private static int factorial(int value) {
        if (value == 0)
            return 1;
        return value * factorial(value - 1);

    }
}

无法访问静态方法中的常规方法

实例方法与该类型的特定实例相关联,其中as静态方法与整个类型相关联

试一试

-----------
无法访问静态方法中的常规方法

实例方法与该类型的特定实例相关联,其中as静态方法与整个类型相关联

试一试

-----------
正如错误明确指出的,您不能访问静态方法中的非静态方法,为了使此代码正常工作,请按如下所示更改您的
factorial
定义:

private static int factorial(int value) {
  //remaining code
}

正如错误明确指出的,您不能访问静态方法中的非静态方法,为了使此代码正常工作,请按如下所示更改您的
factorial
定义:

private static int factorial(int value) {
  //remaining code
}

我刚刚测试过这个。我的编译器对此代码不满意,直到我将调用更改为
factorial
,使其与函数定义匹配:

int result = factorial(23);
而不是

int result = factorial(); 
还需要将
factorial
的函数声明更改为
static

private int factorial(int value) {

但它需要这两种东西才能工作。

我刚刚测试了这个。我的编译器对此代码不满意,直到我将调用更改为
factorial
,使其与函数定义匹配:

int result = factorial(23);
而不是

int result = factorial(); 
还需要将
factorial
的函数声明更改为
static

private int factorial(int value) {

但它需要这两种方法才能工作。

要从静态方法调用非静态方法,请创建包含该非静态方法的类的对象。根据定义,只能对某个类的对象调用非静态方法,而可以对该类本身调用静态方法。

要从静态方法调用非静态方法,请创建包含该非静态方法的类的对象。根据定义,非静态方法只能在某个类的对象上调用,而静态方法可以在该类本身上调用。

如果您不希望方法是静态的,或者您希望从另一个类调用它,这是另一种方法:

public class App {
    public static void main (String args[]) { 
        new App();
    }

    private int factorial(int value) {
        if (value == 0) 
            return 1;
        int sum = value * factorial(value-1);
        return sum;
    }

    public App(){
        int result = factorial(6);
        System.out.println(result);
    }
}

方法
factorial(int-value)
是参数化的,因此您应该像我在上面的示例中所传递的那样将
int
值传递给它。

如果您不希望方法是一个
静态方法,或者希望从另一个类调用它,这是另一种方法:

public class App {
    public static void main (String args[]) { 
        new App();
    }

    private int factorial(int value) {
        if (value == 0) 
            return 1;
        int sum = value * factorial(value-1);
        return sum;
    }

    public App(){
        int result = factorial(6);
        System.out.println(result);
    }
}

方法
factorial(int-value)
是参数化的,因此您应该像我在上面的示例中所传递的那样,将
int
值传递给它。

只要添加
static
关键字,您的代码就可以正常工作

private static int factorial(int value) {

只要添加
static
关键字,您的代码就可以正常工作

private static int factorial(int value) {

private int factorial()
更改为
private static int factorial()
是否应该使用参数调用
factorial
?您正在使用
factorial()
调用它。将参数传递给
factorial(int)
方法。要么使其成为静态的,要么通过当前类
App
like
newapp().factorial(100)的实例调用它
。将
private int factorial()
更改为
private static int factorial()
是否应该使用参数调用
factorial
?您正在使用
factorial()
调用它。将参数传递给
factorial(int)
方法。要么使其成为静态的,要么通过当前类
App
like
newapp().factorial(100)的实例调用它。factorial方法希望解析一个int值,但对于您的解决方案,它什么也得不到。也许你打错了?对不起,是的,我忘了传递一个参数,谢谢你指出,我已经修复了我原来的帖子。即使使用您的解决方案,我仍然不幸地遇到相同的运行时错误。@AbdullaKubba所使用的java版本是什么?您是否在使用IDE来进行测试development@AbdullaKubba您不应该从
main
method中删除
static
。阶乘方法希望解析一个int值,但在您的解决方案中,它什么也得不到。也许你打错了?对不起,是的,我忘了传递一个参数,谢谢你指出,我已经修复了我原来的帖子。即使使用您的解决方案,我仍然不幸地遇到相同的运行时错误。@AbdullaKubba所使用的java版本是什么?您是否在使用IDE来进行测试development@AbdullaKubba您不应该从
main
方法中删除
static
。如果我将阶乘方法设置为静态,我仍然会得到相同的运行时错误。@AbdullaKubba它需要