Java 无法从静态上下文引用非静态方法compute(int)

Java 无法从静态上下文引用非静态方法compute(int),java,Java,下面给出的代码出现以下错误:-无法从静态上下文引用非静态方法计算(int) 如果我不能在main()内创建方法,我该怎么办 class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner key = new Scanner(System.in); int t = key.nextInt(); for(int i=0;i<t;i++){

下面给出的代码出现以下错误:-无法从静态上下文引用非静态方法计算(int) 如果我不能在main()内创建方法,我该怎么办

class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
    Scanner key = new Scanner(System.in);
    int t = key.nextInt();
    for(int i=0;i<t;i++){
        int a = key.nextInt();
        int b = key.nextInt();
        a=compute(a);
        b=compute(b);
        System.out.println(a+b);
    }   
}
int compute(int a){
    int basea=0, digit;
    int temp=a;
    while(temp>0){
        digit = temp%10;
        temp/=10;
        if(digit>(basea-1))basea=digit+1;
    }
    temp=a;
    a=0;
    int count=0;
    while(temp>0){
        digit = temp%10;
        temp/=10;
        a+=digit*Math.pow(basea,count);
        count++;
    }
    return a;
}
类表意符
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
扫描仪键=新扫描仪(System.in);
int t=key.nextInt();
对于(int i=0;i0){
数字=温度%10;
温度/=10;
如果(数字>(basea-1))basea=数字+1;
}
温度=a;
a=0;
整数计数=0;
而(温度>0){
数字=温度%10;
温度/=10;
a+=数字*数学功率(basea,计数);
计数++;
}
返回a;
}

您有两个选择:

  • 声明
    compute()
    静态:

    static int compute(int a){
    
  • 创建
    IdeOne
    的实例,并通过该引用调用
    compute()

    IdeOne ideOne = new IdeOne();
    a = ideOne.compute(a);
    

  • 我认为最好通读一下。

    您试图从静态方法(main)调用非静态方法(即compute)


    int compute(int a){
    更改为
    static int compute(int a){

    在您的情况下,使方法
    compute
    静态。否则,创建
    Ideone
    对象并在其上调用您的方法。

    您不能从
    static
    方法访问
    非静态的
    方法。
    您尝试访问的方法是实例级方法,没有类实例,您无法访问实例方法/变量。
    您无法访问不存在的内容。默认情况下,非静态方法还不存在,直到您创建方法所在类的对象。静态方法始终存在

    您可以通过以下方式访问您的方法:
    1.将
    compute()
    方法设为静态

     int compute(int a){  
      ///rest of your code  
     }  
    
    2.按类对象创建类的实例
    Ideone
    和访问方法

    IdeOne obj = new IdeOne();  
    obj.compute(a);
    obj.compute(b);
    

    这里给出的答案主要是使方法
    静态
    ,这对于这样大小的程序来说是很好的。然而,随着项目越来越大,并不是所有的东西都会在你的main中,因此你会在更大的范围内得到这个静态/非静态的问题,因为你的其他类不会是静态的

    然后,解决方案变成为您的
    Main
    创建一个类,如下所示:

    public class Main {
    
    public static void main( String[] args ) {
    
    Ideone ideone = new Ideone();
    
    然后是另一个存放您的
    类Ideone
    的文件:

    public class Ideone {
    
     Scanner key;
    
     public Ideone() {
    
        key = new Scanner(System.in);
        int t = key.nextInt();
        for(int i=0;i<t;i++){
            int a = key.nextInt();
            int b = key.nextInt();
            a=compute(a);
            b=compute(b);
            System.out.println(a+b);
    
       } // end constructor
    
        int compute(int a){
           int basea=0, digit;
           int temp=a;
           while(temp>0){
             digit = temp%10;
             temp/=10;
             if(digit>(basea-1))basea=digit+1;
        }
        temp=a;
        a=0;
        int count=0;
        while(temp>0){
            digit = temp%10;
            temp/=10;
            a+=digit*Math.pow(basea,count);
            count++;
        }
        return a;
       } // end compute
    
    } // end class
    
    公共类Ideone{
    扫描键;
    公共表意词(){
    键=新扫描仪(System.in);
    int t=key.nextInt();
    对于(int i=0;i0){
    数字=温度%10;
    温度/=10;
    如果(数字>(basea-1))basea=数字+1;
    }
    温度=a;
    a=0;
    整数计数=0;
    而(温度>0){
    数字=温度%10;
    温度/=10;
    a+=数字*数学功率(basea,计数);
    计数++;
    }
    返回a;
    }//结束计算
    }//结束类
    
    至于您的主文件,我所做的将起作用,但更好的做法是遵循此处给出的代码示例:


    应用此实践将确保您的项目中没有任何静态/非静态问题,因为唯一静态的事情是实际代码的初始化,然后处理所有代码/其他类的进一步初始化(都是非静态的)

    静态与非静态
    您不能在静态方法中使用非静态方法。