嘿伙计们,所以我得到了这段代码:
String arch = System.getenv("PROCESSOR_ARCHITECTURE");
String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");
String realArch = arch.endsWith("64")
|| wow64Arch != null && wow64Arch.endsWith("64")
? "64" : "32";
public String officeLoc() throws IllegalArgumentException, InvocationTargetException, IllegalAccessException{
if(realArch.contains("64")){
String tempLoc = WinRegistry.readString (
WinRegistry.HKEY_LOCAL_MACHINE, //HKEY
"SOFTWARE\\Wow6432Node\\Microsfot\\Office", //Key
"InstallDir"); //ValueName
System.out.println("Location = " + tempLoc);
}else{
String tempLoc = WinRegistry.readString (
WinRegistry.HKEY_LOCAL_MACHINE, //HKEY
"SOFTWARE\\Microsoft\\Office\\", //Key
"InstallDir"); //ValueName
System.out.println("Location = " + tempLoc);
}
}
我无法将tempLoc值返回给officeLoc。我尝试了返回字符串x;甚至是静止的,但它并没有像那样工作。 我做错了什么?
答案 0 :(得分:2)
您可能正在研究java语法的规则。因为:除非您的代码示例中存在拼写错误,否则您的问题只是您的方法
public String officeLoc() ...
缺少最终的
return tempLoc;
}
语句! (好吧,但正如杰森在他的回答中提到的那样:只有在你在该方法的开头宣布了一次tempLoc时才会有效。
只是为了它,你会重写整个事情
public String officeLoc() throws IllegalArgumentException, InvocationTargetException, IllegalAccessException{
if(realArch.contains("64")) {
return lookupRegistry("SOFTWARE\\Wow6432Node\\Microsfot\\Office");
}
return lookupRegistry("SOFTWARE\\Microsfot\\Office");
}
并有一个帮助方法lookupRegistry(String key)
return WinRegistry.readString (
WinRegistry.HKEY_LOCAL_MACHINE, key, "InstallDir");
您会看到:您绝对希望尽量减少代码重复的数量!
答案 1 :(得分:1)
还有其他方法可以改进您的代码,但专注于手头的问题:您的混淆可能集中在tempLoc
的{{3}}。如果您有这样的事情:
public String officeLoc () {
if (...) {
String tempLoc = ...;
} else {
String tempLoc = ...;
}
}
那些两个不同的 tempLoc
变量的范围仅在它们周围的{
和}
之间;一旦超出范围,tempLoc
就不再可见了。因此,您无法做到这一点(听起来就像您尝试过的那样):
public String officeLoc () {
if (...) {
String tempLoc = ...;
} else {
String tempLoc = ...;
}
return tempLoc; // <- can't do this, tempLoc is out of scope
}
基本上你有两种选择。你可以这样做:
public String officeLoc () {
if (...) {
String tempLoc = ...;
return tempLoc; // <- no problem
} else {
String tempLoc = ...;
return tempLoc; // <- no problem
}
}
或者您可以将tempLoc
移到更高的范围,如下所示:
public String officeLoc () {
String tempLoc; // <- declare it here
if (...) {
tempLoc = ...; // <- set its value
} else {
tempLoc = ...; // <- set its value
}
return tempLoc; // <- no problem
}
无论哪种方式,它都需要在return
语句所在的范围内可见。就个人而言,我更喜欢后者,因为我喜欢将返回点作为样式选择最小化,但这取决于你。 / p>
您可能还希望阅读一些关于scope的内容,因为您尝试使用它会表明您可能无法完全了解其实际内容。
答案 2 :(得分:0)
所以我做了一些反思,我想出了这个:
String setWin = ((realArch.contains("64")) ? "SOFTWARE\\Wow64Node\\Microsoft\\Office" : "SFOTWARE\\Microsoft\\Office");
String officeLoc = WinRegistry.readString(WinRegistry.HKEY_LOCAL_MACHINE,setWin,"InstallDir");
但是officeLoc字符串有一个未报告的异常“IllegalAccessException”,我不知道如何捕获或抛出它//或哪种方式更好
PS:感谢您的建议Jason C我完全忘记了静态