代码之家  ›  专栏  ›  技术社区  ›  Stephen C

“error:'.class'expected”是什么意思以及如何修复它

  •  1
  • Stephen C  · 技术社区  · 6 年前

    偶尔,新用户会遇到以下相当模糊的编译错误 '.class' expected :

    double d = 1.9;
    int i = int d;  // error here
             ^
    error: '.class' expected
    

    一些Java IDE编译器对此略有不同;

    error: insert ". class" to complete Expression 
    

    这样的错误怎么办 实际上意味着 ,是什么导致了这些问题,您应该如何解决这些问题?


    请注意,这是一个自我回答的问题,旨在帮助和教育人们第一次遇到这一问题。有很多现有的问题都有这个错误消息的具体例子,但是没有一个答案能够真正解释消息的真正含义。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Stephen C    6 年前

    首先,这是一个编译错误。如果你看到留言 运行时 ,您可能正在运行有编译错误的代码。

    下面是几个错误示例:

    double d = 1.9;
    int i = int d;  // error here
             ^
    
    int j = someFunction(int[] a);  // error here
                           ^
    

    在这两种情况下,编译器错误消息将 error: '.class' expected .

    错误消息是什么意思?是什么引起的?

    编译器在语法检查过程中被一些(坦率地说)无意义的代码搞得相当混乱。编译器遇到一个类型(例如 int int[] )在实际需要表达式的上下文中。它是说,在这一点上唯一在语法上可以接受的符号是 . 然后 class .

    下面是一个示例,其中该语法是正确的;

    Class<?> clazz = int;         // incorrect
    Class<?> clazz = int.class;   // correct!
    

    注:应始终 可能的 算出 为什么? 编译器的语法检查程序认为类型应该是表达式。但是,将其视为“编译器混乱”并查找(不可避免的!)引起混乱的语法错误。语法错误可能不明显…对于初学者…但知道这是根本原因是一个良好的开端。

    你怎么修理它?

    不幸的是,增加 .class 几乎总是错误的。在这个答案开头的两个例子中,这当然没有帮助!

    实际的修复取决于您试图通过将类型放在那里实现什么。

    • 如果你打算写 铸型 ,然后需要在类型周围放置括号(圆括号);例如

      double d = 1.9;
      int i = (int) d;   // Correct: casts `1.9` to an integer
      
    • 如果您只是想按原样分配一个值或传递一个参数,那么应该删除该类型。

      int j = someFunction(a);  // Correct ... assuming that the type of
                                // 'a' is suitable for that call.
      

      您需要指定 形式参数 在声明方法时。但您通常不需要为 实际论证 . 在很少的情况下(为了解决重载模糊性),使用类型转换。

    更多例子

    someMethod(array[]);
    

    在上报告错误 array[] 因为这是一个类型而不是表达式。修正可能是:

    someMethod(array);                  // pass ref to the entire array
    

    someMethod(array[someExpression]);  // pass a single array element
    

    int i = int(2.0);
    

    程序设计员正试图打字。应该这样写:

    int i = (int) 2.0;
    

    if (someArray[] > 80) {
        // ...
    }
    

    这个 someArray[] 表示类型而不是表达式。程序员的意思可能是 someArray[someIndex] > 80 someArray.length > 80 .


    if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
        double cur = acnt_balc - (withdraw + 0.50);
        System.out.println(cur);
    else
        System.out.println(acnt_balc);
    

    这里的错误是在“then”语句周围应该有大括号。

    if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50)) {
        double cur = acnt_balc - (withdraw + 0.50);
        System.out.println(cur);
    } else {
        System.out.println(acnt_balc);
    }
    

    但是编译器的困惑在于“if”的“then”子句不能是变量声明。所以解析器正在寻找一个可能是方法调用的表达式。例如,以下内容在本地语法上是有效的:

    if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
        double.class.newInstance();   // no compilation error here
    

    ……尽管在它试图做什么方面是无稽之谈。当然,编译器会跳过悬空 else .