Java 字符串的复述方法
嘿,伙计们,我得到了这个密码:Java 字符串的复述方法,java,string,Java,String,嘿,伙计们,我得到了这个密码: String arch = System.getenv("PROCESSOR_ARCHITECTURE"); String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432"); String realArch = arch.endsWith("64") || wow64Arch != null && wow64Arch.endsWith("64") ? "64" : "32"
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;甚至是静态的,但它不是这样工作的。
我做错了什么?您可能在学习java语法规则。因为:除非您的代码示例中有打字错误,否则您的问题只是您的方法
public String officeLoc() ...
他错过了决赛
return tempLoc;
}
声明!(好吧,但正如Jason在回答中提到的那样:只有在该方法的开头准确地声明了一次tempLoc,这才有效
就为了这个,你会重写整件事
public String officeLoc() throws IllegalArgumentException, InvocationTargetException, IllegalAccessException{
if(realArch.contains("64")) {
return lookupRegistry("SOFTWARE\\Wow6432Node\\Microsfot\\Office");
}
return lookupRegistry("SOFTWARE\\Microsfot\\Office");
}
并有一个助手方法lookupRegistry(字符串键),该方法
return WinRegistry.readString (
WinRegistry.HKEY_LOCAL_MACHINE, key, "InstallDir");
您可以看到:您绝对希望最大限度地减少代码重复!还有其他方法可以改进您的代码,但请关注当前的问题:您的困惑可能集中在
tempLoc
的问题上。如果您有这样的问题:
public String officeLoc () {
if (...) {
String tempLoc = ...;
} else {
String tempLoc = ...;
}
}
public String officeLoc () {
String tempLoc; // <- declare it here
if (...) {
tempLoc = ...; // <- set its value
} else {
tempLoc = ...; // <- set its value
}
return tempLoc; // <- no problem
}
然后,这两个不同的tempLoc
变量的作用域仅在它们周围的{
和}
之间;tempLoc
一旦超出作用域,就不再可见。因此,您无法做到这一点(听起来像是您尝试过的):
无论哪种方式,它都需要在return
语句所在的范围内可见。就个人而言,我更喜欢后者,因为我喜欢将返回点最小化作为一种样式选择,但这取决于您
您可能还希望阅读一些关于它的内容,因为您尝试使用它表明您可能不完全了解它的实际用途。因此,我进行了一些反思,并提出了以下建议:
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我完全忘记了静态的很棒的建议,尽管它不仅仅是缺少的最终返回。只是在函数末尾添加它不会让它编译(我想OP已经尝试过了)因为
tempLoc
是在if
块中声明的。听起来真正的问题是OP不理解tempLoc
的范围,然后做了一些挥手的尝试,但失败了。@JasonC当然,你已经得到了+1;因为我认为你的答案也很好。我忽略了范围这一点。
public String officeLoc () {
String tempLoc; // <- declare it here
if (...) {
tempLoc = ...; // <- set its value
} else {
tempLoc = ...; // <- set its value
}
return tempLoc; // <- no problem
}
String setWin = ((realArch.contains("64")) ? "SOFTWARE\\Wow64Node\\Microsoft\\Office" : "SFOTWARE\\Microsoft\\Office");
String officeLoc = WinRegistry.readString(WinRegistry.HKEY_LOCAL_MACHINE,setWin,"InstallDir");