TreeMap抛出"fromKey > toKey"异常及XML参数存入HashMap问题咨询
Hey there! Let's break down your two technical questions and walk through the solutions clearly:
First off, that error pops up when you use TreeMap methods like subMap(), headMap(), or tailMap() with a fromKey that's greater than toKey. TreeMap relies on ordered keys (either natural sorting or a custom comparator), so these range methods enforce fromKey <= toKey by default.
Here's how to handle it properly:
Check and swap keys dynamically
Use the TreeMap's comparator (or natural ordering for Comparable keys) to compare the two keys first. IffromKeyis larger, swap them to avoid the exception. Here's a reusable helper method:import java.util.Comparator; import java.util.SortedMap; import java.util.TreeMap; public static <K,V> SortedMap<K,V> safeRangeSubMap(TreeMap<K,V> map, K fromKey, K toKey) { Comparator<? super K> comparator = map.comparator(); int comparison; // Use custom comparator if provided, else natural ordering if (comparator != null) { comparison = comparator.compare(fromKey, toKey); } else { comparison = ((Comparable<? super K>) fromKey).compareTo(toKey); } if (comparison > 0) { // Swap keys to get a valid range, or return empty map if you don't want reversed results return map.subMap(toKey, fromKey); // Alternative: return Collections.emptySortedMap(); } return map.subMap(fromKey, toKey); }Validate inputs upfront
If you control wherefromKeyandtoKeycome from, add a check before calling TreeMap range methods to catch invalid pairs early:if (((Comparable) fromKey).compareTo(toKey) > 0) { throw new IllegalArgumentException("fromKey cannot be greater than toKey"); // Or handle the issue gracefully, e.g., log a warning and return an empty map }
Looking at your XML parameters stored in extraParams, I notice a couple of issues first—let's fix those and then cover how to use the data effectively.
Step 1: Fix incomplete parameters
Your url value is truncated (jdbc:mysql://tesco-db.ce7gg2eo7hdc.us-) and there's a partial <parameter name="... entry. First, you'll need to:
-补全 the JDBC URL to its full form (e.g., jdbc:mysql://tesco-db.ce7gg2eo7hdc.us-east-1.rds.amazonaws.com:3306/your_database?useSSL=false)
- Remove or complete the partial parameter entry to avoid invalid data in your HashMap.
Step 2: Extract and use the parameters
Once your HashMap has clean data, here's how to leverage these values (e.g., for a JDBC connection):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class ParamHandler { public static void main(String[] args) { HashMap<String, String> extraParams = new HashMap<>(); // Populate with your corrected parameters extraParams.put("sourceAttrStart", "true"); extraParams.put("user", "admin"); extraParams.put("password", "password"); extraParams.put("SQL", "SELECT * FROM test.users"); extraParams.put("driverClass", "com.mysql.jdbc.Driver"); extraParams.put("url", "jdbc:mysql://tesco-db.ce7gg2eo7hdc.us-east-1.rds.amazonaws.com:3306/test"); // Validate required parameters first List<String> requiredParams = Arrays.asList("driverClass", "url", "user", "password", "SQL"); for (String param : requiredParams) { String value = extraParams.get(param); if (value == null || value.trim().isEmpty()) { throw new IllegalArgumentException("Missing or empty required parameter: " + param); } } // Extract values String driverClass = extraParams.get("driverClass"); String url = extraParams.get("url"); String user = extraParams.get("user"); String password = extraParams.get("password"); String sqlQuery = extraParams.get("SQL"); boolean sourceAttrStart = Boolean.parseBoolean(extraParams.get("sourceAttrStart")); // Load JDBC driver (optional in JDBC 4.0+) try { Class.forName(driverClass); } catch (ClassNotFoundException e) { System.err.println("Failed to load JDBC driver: " + e.getMessage()); return; } // Execute SQL query try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sqlQuery)) { // Process the result set while (rs.next()) { // Example: Get username column value String username = rs.getString("username"); System.out.println("User: " + username); } // Use the sourceAttrStart flag if needed if (sourceAttrStart) { System.out.println("Source attribute start is enabled—running additional logic..."); // Add your custom logic here } } catch (Exception e) { System.err.println("Database operation failed: " + e.getMessage()); e.printStackTrace(); } } }
Step 3: Optional - Clean up parameter parsing
If you're regularly converting XML parameters to HashMaps, consider using a library like JAXB or DOM parser to automate this and avoid manual entry errors. But since you already have the data in a HashMap, the above approach works perfectly for direct usage.
内容的提问来源于stack exchange,提问作者Swapnil Kotwal

