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