如何在eclipse mars中强制重命名变量名

时间:2015-11-22 14:15:13

标签: java eclipse refactoring eclipse-mars

我如何强制 eclipse火星重命名变量名? 当我尝试时,我得到了

  

由于语法错误,无法正确执行此重构   编译单位。

该对话框仅提供“取消”。

可以在旧版本的eclipse中执行此操作,并且我广泛使用了该功能,例如在网络上找到的代码片段的复制和粘贴之后。

请注意,这不是Refactoring variable names in Eclipse的重复。

编辑3(发生的事情摘要):

在代码中(如下所示)不仅是缺少导入或未声明变量等常见错误,而且还缺少“;”,因此真正的语法错误。这首先隐藏在其他几个编译问题中,导致eclipse拒绝重构。

事实证明,这不是火星的特殊功能,也不是旧版本的日食。

编辑:这是我的示例代码。它主要基于mongodb的tutorialspoint示例,但很可能与mongo没有任何关系。

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.client.MongoDatabase;

public class MongoDBJDBC2 {

  private static String myUserName;
  private static String myPassword;
  private static String myHost = "localhost";
  private static String myDatabaseName = "mydb";
  private static MongoDatabase db;

  public MongoDBJDBC2() {
    initDb();
    // TODO Auto-generated constructor stub
  }

  public static void main(String args[]) {
    MongoDBJDBC2 mo = new MongoDBJDBC2();
  }

  private static void initDb() {
    MongoClientURI uri = new MongoClientURI(
        "mongodb://" + myUserName + ":" + myPassword + "@" + myHost + "/?authSource=db1");
    try (MongoClient mongoClient = new MongoClient(uri);) {

      db = mongoClient.getDatabase(myDatabaseName);
      System.out.println("Connect to database successfully");
      //  boolean auth = db.authenticate(myUserName, myPassword);

    } catch (Exception e) {
      System.err.println(e.getClass().getName() + ": " + e.getMessage());
    }
  }

  public static void main4( String args[] ) {

    try{   

       // To connect to mongodb server
       MongoClient mongoClient = new MongoClient( "localhost" , 27017 );

       // Now connect to your databases
       DB db = mongoClient.getDB( "test" );
       System.out.println("Connect to database successfully");

       boolean auth = db.authenticate(myUserName, myPassword);
       System.out.println("Authentication: "+auth);   

       DBCollection coll = db.getCollection("mycol");
       System.out.println("Collection mycol selected successfully");

       DBCursor cursor = coll.find();

       while (cursor.hasNext()) { 
          DBObject updateDocument = cursor.next();
          updateDocument.put("likes","200")
          col1.update(updateDocument); 
       }

       System.out.println("Document updated successfully");
       cursor = coll.find();

       int i = 1;

       while (cursor.hasNext()) { 
          System.out.println("Updated Document: "+i); 
          System.out.println(cursor.next()); 
          i++;
       }

    }catch(Exception e){
       System.err.println( e.getClass().getName() + ": " + e.getMessage() );
    }
 }

}

我尝试在

中将db重命名为myDb
private static MongoDatabase db;

以前我使用的是eclipse Helios,从未遇到过这种“功能”。

Edit2:我找到了致命错误。在方法“main4”中,在

之后缺少分号
updateDocument.put("likes", "200")

仍然不明白为什么这会让eclipse如此沮丧,以至于它拒绝重构,我仍然想知道是否有办法强制重构,尽管有错误。

2 个答案:

答案 0 :(得分:1)

编译器会发出两种错误:语法错误和所有其他类型的错误,例如“类型不匹配”和“未找到符号”。 Eclipse抱怨语法错误。您是否确定在之前的情况下Eclipse同意重构您的代码尽管它包含错误,但是您的代码包含 syntax 错误?你看,有一个的区别。

重新编写java中的符号名称比简单的文本搜索和替换更为复杂,必须考虑代码的结构。

但是在语法错误的情况下,编译器放弃了解析你的文件,所以它不知道代码的结构:它不知道哪些标记是变量,哪些标记是类型,哪些标记是方法等等,所以它真的无法进行你想要的重构。

所以,如果你必须真正继续你的重构,尽管有语法错误,那么我担心在这种特殊情况下,文本搜索和替换是你的方式。

但是在尝试重构之前修复语法错误将是最谨慎的事情。

答案 1 :(得分:0)

当您的代码中出现编译问题时会发生这种情况。 修复编译问题,而不是重构你的代码。最近在eclipse的新版本中引入了这个功能。