Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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 字符串的复述方法_Java_String - Fatal编程技术网

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");