Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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 如何在EclipseMars中强制重命名变量名_Java_Eclipse_Refactoring_Eclipse Mars - Fatal编程技术网

Java 如何在EclipseMars中强制重命名变量名

Java 如何在EclipseMars中强制重命名变量名,java,eclipse,refactoring,eclipse-mars,Java,Eclipse,Refactoring,Eclipse Mars,如何强制EclipseMars重命名变量名? 当我尝试时,我得到 由于中的语法错误,无法正确执行此重构 编辑单位 该对话框仅提供“取消” 在旧版本的eclipse中可以做到这一点,我广泛使用了该功能,例如在复制和粘贴了在网上找到的代码片段之后 请注意,这不是的副本 编辑3(事件摘要): 在代码中(如下所示),不仅有那些常见的错误,如缺少导入或未声明的变量,还有一个缺少“;”,因此是一个真正的语法错误。这一点最初隐藏在其他几个编译问题中,导致eclipse拒绝重构 事实证明,这不是mars的一个特

如何强制EclipseMars重命名变量名? 当我尝试时,我得到

由于中的语法错误,无法正确执行此重构 编辑单位

该对话框仅提供“取消”

在旧版本的eclipse中可以做到这一点,我广泛使用了该功能,例如在复制和粘贴了在网上找到的代码片段之后

请注意,这不是的副本

编辑3(事件摘要):

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

事实证明,这不是mars的一个特殊功能,也是旧版本eclipse的一个特殊功能

编辑:下面是我的示例代码。它主要基于TutorialPoint for mongodb的示例,但很可能与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;
以前我使用EclipseHelios,从未遇到过这种“特性”

Edit2:我找到了致命错误。在方法“main4”中,后面缺少分号

updateDocument.put("likes", "200")

我仍然不明白为什么这会让eclipse如此不安,以至于它拒绝重构,我仍然想知道是否有办法在出现错误的情况下强制重构。

当代码中存在编译问题时,就会发生这种情况。
修复编译问题,然后重构代码。是的,此功能最近在较新版本的eclipse中引入。

编译器会出现两种错误:语法错误和所有其他类型的错误,如“类型不匹配”和“找不到符号”。Eclipse抱怨语法错误。您确定在以前的情况下,Eclipse同意重构您的代码,尽管它包含错误,但您的代码包含的是语法错误吗?你看,这有很大的不同

在java中重构符号名称远比简单的文本搜索和替换复杂得多,必须考虑代码的结构

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

因此,如果您确实必须继续进行重构,尽管存在语法错误,那么我担心在这种情况下,文本搜索和替换是您的最佳选择


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

解决编译错误并重试。要替换的变量是静态的。当我删除静态修改器并再次尝试时,“…重构无法…”被减少为警告,在“取消”按钮旁边出现“继续”。所以我猜有两个级别的错误,一个允许继续,另一个是致命的。你能确认哪个旧版本可以使用,如果可能的话,一个在旧版本中工作,而不是在新版本中工作吗。如果你能把这些放在一起,那么你就有了一份完美的Eclipse bug报告,你可以在@JonahGraham上提交它,让Eclipse变得更好。你可以看看并减少我的示例,这需要一些时间。@如果你提交这样一份bug报告,Eclipse社区将非常感激,这听起来像是一个在没有人注意到的情况下倒退的例子。我认为这个答案大部分是好的,但最后一段有点极端。粘贴一些导致错误的代码,然后进行重构,这种情况并不少见。事实上,Eclipse甚至没有警告您对重复的局部变量执行重命名错误,但它重命名的事件可能不是您想要的。@JonahGraham您是对的。我甚至在粘贴代码时利用了这一点。我将更改最后一段。@MikeNakis感谢您指出各种错误对eclipse的影响。在我看来有点疯狂的是,eclipse不仅标记了错误,而且还注意到“;”丢失了,但仍然受到致命的干扰。是的,语法错误往往会这样做。分号尤其是一个非常敏感的主题,因为解析器在很大程度上依赖分号来将代码划分为语句,然后试图使语句有意义。因此,语句语法错误通常会被报告为分号问题。java在这方面并不像其他语言那么怪异。以C++为例:C++编译器所犯的错误通常不会指向程序员错误的位置。(当谈到检查语法正确性时,java是一个完美的梦想,C++是标准的,真正的恐怖是Perl)。