// 异常信息格式化 List<String> stackTraceList = LogUtil.formatStackTraceElement(stackTrace, exceptionType, exceptionCauseMsg); // 获取线程变量 List<String> threadLocalLogs = LogUtil.getThreadLocalLogs(); threadLocalLogs.addAll(stackTraceList); testResultBean.setLog(threadLocalLogs);中 threadLocalLogs.addAll(stackTraceList);报异常UnsupportedOperationException ,为什么
时间: 2024-04-19 11:24:41 浏览: 126
根据你提供的代码片段,当执行 `threadLocalLogs.addAll(stackTraceList)` 时抛出 `UnsupportedOperationException` 异常的原因可能是 `threadLocalLogs` 对象是一个不可修改的列表。
`addAll` 方法用于将另一个集合中的元素添加到目标集合中。然而,如果目标集合是只读的或不可修改的,则无法执行添加操作,会抛出 `UnsupportedOperationException` 异常。
要解决这个问题,你可以考虑使用一个可变的列表来存储日志信息,而不是使用不可修改的列表。你可以尝试使用 `ArrayList` 或 `LinkedList` 等可变列表的实现类,确保 `threadLocalLogs` 对象是可修改的。
另外,如果 `LogUtil.getThreadLocalLogs()` 方法返回的是一个不可修改的列表,你可以考虑将其转换为可变列表。例如,可以使用 `new ArrayList<>(LogUtil.getThreadLocalLogs())` 创建一个新的可变列表,并将其赋值给 `threadLocalLogs` 变量。
请注意,具体的解决方案取决于 `LogUtil` 类的实现和 `threadLocalLogs` 对象的类型。确保使用支持修改操作的可变列表来解决此问题。
相关问题
解释一下这段代码 private ImmutableList<LauncherApp> mergeWithDefaultApps( int maxLimit, ImmutableList<LauncherApp> recentApps) { int numToAdd = maxLimit - recentApps.size(); LogUtil.logD(TAG, "mergeWithDefaultApps numToAdd = " + numToAdd); if (numToAdd <= 0) { LogUtil.logDOrNotUser(TAG, "No need to merge with defaultApps"); return recentApps; } List<DefaultLauncherApp> defaultApps = loadDefaultApps(); LogUtil.logDOrNotUser(TAG, "Have to merge with " + defaultApps.size() + " default apps"); // verify that our defaults are not adding duplicates boolean enableRemovalOfDefaultRecents = enableRemovalOfDefaultRecentsProvider.get(); List<LauncherApp> matchedDefaultsList = new ArrayList<>(); for (LauncherApp app : recentApps) { Predicate<DefaultLauncherApp> matchesRecentApp = defaultApp -> matches(defaultApp, app); if (enableRemovalOfDefaultRecents) { Iterables.addAll(matchedDefaultsList, Iterables.filter(defaultApps, matchesRecentApp)); } Iterables.removeIf(defaultApps, matchesRecentApp); } if (enableRemovalOfDefaultRecents && !matchedDefaultsList.isEmpty()) { // If the user has used an app which we are populating as a default, then we can stop // promoting it in the future. hiddenDefaultRecentsHelper.hideDefaultRecentApp(matchedDefaultsList); } List<LauncherApp> mergedRecentApps = new ArrayList<>(recentApps); numToAdd = min(numToAdd, defaultApps.size()); LogUtil.logD(TAG, "numToAdd = " + numToAdd); if (numToAdd > 0) { mergedRecentApps.addAll(defaultApps.subList(0, numToAdd)); } // Try to find duplicated app and log if there is any. See b/217928263 if (LogUtil.isDorNotUser(TAG)) { Map<String, LauncherApp> appsMap = new HashMap<>(); for (LauncherApp app : mergedRecentApps) { String label = app.getLabel().toString(); LauncherApp duplicatedApp = appsMap.get(label); if (duplicatedApp != null) { LogUtil.logDOrNotUser( TAG, "Found duplicated Launcher App label:" + label + ", \nduplicated app:" + duplicatedApp + " \nand " + app); } appsMap.put(label, app); } } return ImmutableList.copyOf(mergedRecentApps); }
这段代码实现了一个方法,用于将最近使用的应用列表 recentApps 与默认应用列表 defaultApps 合并,并返回合并后的应用列表。其中,maxLimit 是最大应用数,numToAdd 是需要添加到最近使用的应用列表中的应用数量。在方法中,首先检查是否需要与默认应用列表合并,如果不需要,则返回原始的最近使用的应用列表。接下来,该方法会检查默认应用列表中的应用是否与最近使用的应用列表中的应用重复,如果重复,则从默认应用列表中删除该应用。最后,该方法将合并后的应用列表返回,如果有重复的应用,则会打印日志。
解释一下 private List<DefaultLauncherApp> loadDefaultApps() { List<DefaultLauncherApp> defaultApps = new ArrayList<>(); for (ComponentName defaultComponent : getDefaultRecents()) { ActivityDisplayInfo info = applicationInfoRepo.getActivityDisplayInfo( defaultComponent.getPackageName(), defaultComponent.getClassName()); if (info != null) { DefaultLauncherApp launcherApp = DefaultLauncherApp.from( info.getInfo(), info.getLabel(), launcherIconProvider.getLauncherIconSupplier(info, "defaultApp")); defaultApps.add(launcherApp); continue; } LogUtil.logW( TAG, "Unable to get ActivityDisplayInfo for " + defaultComponent.toShortString() + " attempting to fetch from ResolveInfo"); List<ResolveInfo> resolveInfos = applicationInfoRepo.getResolveInfo(defaultComponent.getPackageName()); if (resolveInfos.isEmpty()) { LogUtil.logW( TAG, "Unable to get ResolveInfo for " + defaultComponent.toShortString() + ", not able to add to default recents"); continue; } ResolveInfo resolveInfo = resolveInfos.get(0); ActivityInfo activityInfo = resolveInfo.activityInfo; DefaultLauncherApp app = DefaultLauncherApp.from( activityInfo, activityInfo.loadLabel(packageManager).toString(), launcherIconProvider.getLauncherIconSupplier(resolveInfo, packageManager)); defaultApps.add(app); // apply the first ResolveInfo to avoid duplicated apps. See b/223960101 if (resolveInfos.size() > 1) { LogUtil.logW( TAG, "Get multiple ResolveInfos, apply the first ResolveInfo for " + defaultComponent.toShortString() + ", to avoid duplication:" + activityInfo); } } if (enableRemovalOfDefaultRecentsProvider.get()) { // Filter based on hidden recent apps. defaultApps.removeIf(defaultApp -> shouldHideDefaultRecent(defaultApp.getActivity())); } return new ArrayList<>(); // return defaultApps; }
这是一个方法,其返回类型为私有的 List<DefaultLauncherApp>。该方法用于加载默认应用程序,并将其添加到一个名为 defaultApps 的 ArrayList 中。该方法首先获取默认最近使用过的应用程序的列表,并通过调用 applicationInfoRepo 的 getActivityDisplayInfo 方法获取每个默认应用程序的 ActivityDisplayInfo。如果能够成功获取 ActivityDisplayInfo,则将其转换为 DefaultLauncherApp 并添加到 defaultApps 中。如果不能成功获取 ActivityDisplayInfo,则通过调用 applicationInfoRepo 的 getResolveInfo 方法获取 ResolveInfo 列表,并使用第一个 ResolveInfo 创建 DefaultLauncherApp 并将其添加到 defaultApps 中。如果在获取 ResolveInfo 时发现列表为空,则将跳过该默认应用程序。如果 enableRemovalOfDefaultRecentsProvider 为 true,则将从 defaultApps 中删除应该隐藏的默认最近使用过的应用程序。最后,该方法将返回一个新的 ArrayList,其中包含 defaultApps 中的所有元素。
阅读全文