2014-04-02 61 views
1

我会尽力解释这一点,尽我所能,但请问我重申,如果它不明确。通过传递字符串从交换机获取信息

我有两个类,一个类只包含从其他类传递给它的设置。这些类被称为配置文件和设置,配置文件从一个XML文件中读取设置,并将其传递到使用键和值这样设置:从XML文件中读取

public void readProfile() 
{ 
    // Gets our document ready to be read 
    setProfileDoc(); 

    // Our Root element 
    Element root = getProfileDoc().getDocumentElement(); 

    // The name of our profile 
    Node rootAttrItem = getProfileDoc().getChildNodes().item(0); 
    Node rootAttrName = rootAttrItem.getAttributes().getNamedItem("Name"); 

    // Gets our Name value and stores into an array for later use. 
    String rootAttrValue = rootAttrName.getNodeValue(); 
    addToArray(rootAttrValue, true); 

    // Our XML file contains <Database> and <Batch> with all information in between 
    NodeList dbNodes = root.getElementsByTagName("Database"); 
    NodeList batchNodes = root.getElementsByTagName("Batch"); 

    // Run through our <Database> tags and <Batch tags> and sends the information to Settings 
    for (int x = 0; x < dbNodes.getLength(); x++) 
    { 
     Element eElement = (Element) dbNodes.item(x); 
     NodeList userInfo = eElement.getChildNodes(); 

     for (int y = 0; y < userInfo.getLength(); y++) 
     { 
      Node tempItem = userInfo.item(y); 
      if (!hasWhiteSpace(tempItem)) 
      { 
       String tempKey = tempItem.getNodeName().toString().trim(); 
       String tempValue = tempItem.getTextContent().toString().trim(); 

       settings.setAllSettings(tempKey, tempValue); 
      } 
     } 
    } 

    for (int x = 0; x < batchNodes.getLength(); x++) 
    { 
     Element eElement = (Element) batchNodes.item(x); 
     NodeList batchInfo = eElement.getChildNodes(); 

     for (int y = 0; y < batchInfo.getLength(); y++) 
     { 
      Node tempItem = batchInfo.item(y); 
      if (!hasWhiteSpace(tempItem)) 
      { 
       String tempKey = tempItem.getNodeName().toString().trim(); 
       String tempValue = tempItem.getTextContent().toString().trim(); 

       settings.setAllSettings(tempKey, tempValue); 
      } 
     } 
    } 
} 

所有的设置去设置类,是设置像这样:

public void setAllSettings(String keyIn, String valueIn) 
{ 
    // Holds our keyIn 
    String tempKey = keyIn; 
    String tempValue = valueIn; 


    // Depending on what String is brought in, the appropriate settings will be applied 
    switch (tempKey){ 
     /* 
     * Our main settings 
     */ 
     case "FirstRun": 
      setFirstRun(tempValue); 
     case "LastProfile": 
      setLastProfile(tempValue); 
     case "LastStartedBrewName": 
      setLastStartedBrewName(tempValue); 
     case "LastStartedBrewNumber": 
      setLastStartedBrewNumber(tempValue); 
     case "LastFinishedBrewName": 
      setLastFinishedBrewName(tempValue); 
     case "LastFinishedBrewNumber": 
      setLastFinishedBrewNumber(tempValue); 
     case "CurrentBrewFile": 
      setCurrentBrewFile(tempValue); 
     case "ProfilePath": 
      setProfilePath(tempValue); 
     case "SensorFilePath": 
      setSensorFilePath(tempValue); 
     case "DBConnectionFilePath": 
      setDBConnectionFilePath(tempValue); 
     case "SensorReadIncremental": 
      setSensorReadIncremental(tempValue); 

     /* 
     * Our profile settings 
     */ 
     case "Profile Name": 
      setProfileName(tempValue); 
     case "Database Protocol": 
      setDatabaseProtocol(tempValue); 
     case "Url": 
      setDatabaseUrl(tempValue); 
     case "Port": 
      setDatabasePort(tempValue); 
     case "User": 
      setDatabaseUser(tempValue); 
     case "Pass": 
      setDatabasePass(tempValue); 
     case "Table": 
      setDatabaseTable(tempValue); 

     /* 
     * Our Batch settings 
     */ 
     case "Total": 
      setBatchTotal(tempValue); 
     case "Current": 
      setCurrentBatch(tempValue); 
    } 
} 

现在我可以使用的System.out.println()显示从格式关键的XML文件中读取所有的设置:价值与此正确显示。所有信息被正确读取并正确显示。我可以在配置文件类和设置类中做到这一点,似乎它一切正常。

当我想重新使用这些设置我在个人资料的方法是这样的:

public String getSetting(String whatSetting) 
{ 
    return settings.getSetting(whatSetting); 
} 

肚里的方法中的设置是这样:

public String getSetting(String getSetting) 
{ 
    String chosenValue = ""; 

    // Depending on what String is brought in, the appropriate settings will be applied 
      switch (getSetting){ 
       /* 
       * Our main settings 
       */ 
       case "FirstRun": 
        chosenValue = getFirstRun(); 
       case "LastProfile": 
        chosenValue = getLastProfile(); 
       case "LastStartedBrewName": 
        chosenValue = getLastStartedBrewName();      
       case "LastStartedBrewNumber": 
        chosenValue = getLastStartedBrewNumber();      
       case "LastFinishedBrewName": 
        chosenValue = getLastFinishedBrewName();       
       case "LastFinishedBrewNumber": 
        chosenValue = getLastFinishedBrewNumber();      
       case "CurrentBrewFile": 
        chosenValue = getCurrentBrewFile();      
       case "ProfilePath": 
        chosenValue = getProfilePath();      
       case "SensorFilePath": 
        chosenValue = getSensorFilePath();      
       case "DBConnectionFilePath": 
        chosenValue = getDBConnectionFilePath();       
       case "SensorReadIncremental": 
        chosenValue = getSensorReadIncremental();      

       /* 
       * Our profile settings 
       */ 
       case "Profile Name": 
        chosenValue = getProfileName();      
       case "Database Protocol": 
        chosenValue = getDatabaseProtocol();       
       case "Url": 
        chosenValue = getDatabaseUrl();      
       case "Port": 
        chosenValue = getDatabasePort();       
       case "User": 
        chosenValue = getDatabaseUser();       
       case "Pass": 
        chosenValue = getDatabasePass();       
       case "Table": 
        chosenValue = getDatabaseTable();      

       /* 
       * Our Batch settings 
       */ 
       case "Total": 
        chosenValue = getBatchTotal();      
       case "Current": 
        chosenValue = getCurrentBatch(); 
      } 

    return chosenValue; 
} 

这里的问题是我无法获得正确的返回设置。它通常会返回空值或错误的值 - 其中一个设置是如果它是该程序的第一次运行,而不是返回“否”,将返回“10”

有关这个问题可能有什么想法?

+0

开始增加“打破”;到switch语句 – Taks

回答

4

没有Break声明它会去所有Switch without Break

+0

我加了break;所有的陈述和非常拳头设置返回罚款。因此,FirstRun返回不应该如此,但LastProfile仍然返回空 – adamb53

+1

在设置“LastProfile”之前打印什么应该是tempKey和tempValue的价值 – newuser

+0

我选择这一个作为答案只是因为在LastProfile之前打印导致我找到问题 - 所有的答案都在帮助解决问题 - 谢谢大家和新用户 – adamb53

2

你需要结束每个casebreak声明的情况下,否则继续执行下一case

switch (getSetting){ 
    /* 
    * Our main settings 
    */ 
    case "FirstRun": 
     chosenValue = getFirstRun(); 
     break; 
    case "LastProfile": 
     chosenValue = getLastProfile(); 
     break; 
    ... 
+0

我已添加break;所有的陈述和非常拳头设置返回罚款。所以FirstRun返回no,但是LastProfile仍然返回null – adamb53

0

从文档添加摘录,

每个break语句终止封闭的switch语句。 break语句是必要的,因为没有他们,在开关块告吹声明:匹配的case标签后,所有语句顺序执行,而不管后续的情况下标签的表达,直到遇到一个break语句

0

总体思路是,当给定的条件满足时(开关的值等于case内声明的值),switch语句转到特定的“case”。问题是,如果你不把每个案件与“休息”分开, (正如Keeppil对他的答案所说的+1)如果应用程序发现一个与switch内的值匹配的案例,它将转到该案例和它下面的每个案例!

例如:

int w=12; 
switch(w) { 
case 1: 
    System.out.println("1"); 
case 2: 
    System.out.println("2"); 
case 3: 
    System.out.println("3"); 
case 12: 
    System.out.println("12"); 
case 13: 
    System.out.println("13"); 
case 14: 
    System.out.println("14"); 
    default: 
     System.out.println("d"); 

} 

会打印:

12 
13 
14 
d 

switch(w) { 
case 1: 
    System.out.println("1"); 
    break; 
case 2: 
    System.out.println("2"); 
    break; 
case 3: 
    System.out.println("3"); 
    break; 
case 12: 
    System.out.println("12"); 
    break; 
case 13: 
    System.out.println("13"); 
    break; 
case 14: 
    System.out.println("14"); 
    break; 
    default: 
     System.out.println("d"); 

会打印:

12