字符串

时间:2016-08-26 04:52:12

标签: 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";

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;甚至是静止的,但它并没有像那样工作。 我做错了什么?

3 个答案:

答案 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我完全忘记了静态