try..catch能完全替代if判断吗?java
时间: 2023-07-17 11:05:29 浏览: 164
try..catch不能完全替代if判断,它们有不同的作用和用途。
在Java中,try..catch是用于捕获和处理异常的结构,它可以用来处理可能抛出异常的代码块。当代码块中发生异常时,异常将被捕获并由catch块处理,从而防止程序终止运行。try..catch主要用于处理预期的异常情况。
而if语句是用来进行条件判断的,它根据条件的真假来执行相应的代码块。if语句主要用于根据不同的条件执行不同的逻辑,它可以用于控制程序的流程和决策。
虽然try..catch可以用于处理异常,但它并不能代替if判断。if判断更适合于根据条件进行逻辑判断和控制流程,而try..catch主要用于处理异常情况。在编写代码时,我们需要根据具体的情况选择合适的结构来处理异常和条件判断。
相关问题
优化一下这段代码 import java.util.ArrayList; import java.util.Collections; import java.util.TreeSet; public class MyRun06 implements Runnable { ArrayList<Integer> list = new ArrayList<>(); public MyRun06(ArrayList<Integer> list) { this.list = list; Collections.shuffle(list); } @Override public void run() { TreeSet<Integer> arr = new TreeSet<>(); while (true) { synchronized (MyRun06.class) { if (list.size() == 0) { int sum=0; for (Integer integer : arr) { sum+=integer; } System.out.println(Thread.currentThread().getName() + arr+"最高奖为"+ arr.last()+"和为"+sum); break; } else { arr.add(list.remove(0)); } } /* try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } }
根据你提供的代码,我有以下优化建议:
1. 使用 LinkedList 替代 ArrayList
在这个代码中,你需要频繁地删除列表的第一个元素,使用 LinkedList 可以更有效地实现这个功能,因为 LinkedList 中的元素存储在节点中,删除一个元素只需要修改前一个节点的后继节点和后一个节点的前驱节点即可,不需要像 ArrayList 那样将后面所有元素向前移动。
2. 在构造函数中进行集合的初始化
在这个代码中,你在构造函数中将集合随机打乱,但是你可以在构造函数中直接创建一个已经打乱的集合,避免在运行时进行打乱操作。这可以通过将 ArrayList 改为 List 接口,然后在构造函数中使用 Collections.shuffle() 方法,将打乱后的集合转换为 ArrayList 来实现。
3. 优化同步块
在这个代码中,你使用同步块保证了对 list 的访问是线程安全的,但是这也意味着每个线程只能在获取到锁之后才能访问 list,这可能会导致线程的竞争和阻塞。为了避免这个问题,可以将同步块移到 else 子句中,这样只有在 list 不为空时才需要获取锁。
以下是优化后的代码:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
public class MyRun06 implements Runnable {
private List<Integer> list;
public MyRun06(List<Integer> list) {
this.list = new LinkedList<>(list);
Collections.shuffle(this.list);
}
@Override
public void run() {
TreeSet<Integer> arr = new TreeSet<>();
while (true) {
if (list.isEmpty()) {
int sum = arr.stream().mapToInt(Integer::intValue).sum();
System.out.println(Thread.currentThread().getName() + arr + "最高奖为" + arr.last() + "和为" + sum);
break;
} else {
synchronized (this) {
arr.add(list.remove(0));
}
}
}
}
}
优化这段代码if (ResMeta.PROTOCOL_HTTPS.equals(token.getLoginProtocol()) || ResMeta.PROTOCOL_HTTP.equals(token.getLoginProtocol())) { ssoTicket.setHostDomainName(token.getTargetIp()); ssoTicket.setWebappUrl(token.getLoginProtocol() + "://" + token.getTargetIp()); ssoTicket.setAgreementType(token.getLoginProtocol()); if (!this.fillIssuerInfo(ssoTicket, token.getIssuerId(), token.getIssuerToolId(), token.getResType(), sid)) { String err = "加载应用发布错误"; rv.setDetail(err); rv.setStatus(DataResult.STA_SSO_REGISTER_TICKET_ERR); logger.error(err); return null; } } else if (ResMeta.RESTYPE_CSAPP.equals(token.getResType())){ if (!this.fillIssuerInfo(ssoTicket, token.getIssuerId(), token.getIssuerToolId(), token.getResType(), sid)) { String err = "加载应用发布错误"; rv.setDetail(err); rv.setStatus(DataResult.STA_SSO_REGISTER_TICKET_ERR); logger.error(err); return null; } } else if (ResMeta.PROTOCOL_RDP.equals(token.getLoginProtocol())) { if (ssoAcc != null && ssoAcc.getWinAccType() == AccMeta.WIN_ACC_DOMAIN_TYPE) { this.fillHostDomain(ssoAcc, ssoTicket, token.getAccName()); } else if (resInfo.getHostName() != null && resInfo.getHostName().length() > 0) { ssoTicket.setAcc(resInfo.getHostName() + "\\" + ssoTicket.getAcc()); } } else if (ResMeta.PROTOCOL_SSH2.equals(token.getLoginProtocol()) || ResMeta.PROTOCOL_SSH1.equals(token.getLoginProtocol()) || ResMeta.PROTOCOL_TELNET.equals(token.getLoginProtocol())) { CMDSSOTicket cmdTicket = (CMDSSOTicket) ssoTicket; /* 设置提权(原5.0的扩展策略)如果存在工单号 按工单处理 规则授权暂时不支持设置提权 */ if (token.getWorkId() != null && token.getWorkId().length() > 0) { try { SSOWorkOrderAuthz authz = new SSOWorkOrderAuthz(); authz.setWorkOrderId(token.getWorkId()); authz.setResId(token.getResId()); int suPermission = ssoWorkOrderRepository.findWorkOrderAuthcSuPermission(authz); if (SSORegisterMeta.SU_PERMISSION_YES_VALUE == suPermission && ResMeta.SU_PRIVILEGE_YES_VALUE == resInfo.getSuPrivilege()) { cmdTicket.setSu_cmd(resInfo.getSuCmd()); cmdTicket.setSu_pwd(this.getPasswd(resInfo.getId(), resInfo.getSuManagerAcc())); cmdTicket.setSu_pwd_prompt(resInfo.getSuPwdPrompt()); } } catch (Exception e) { } } else if (token.getAuthzId() != null && token.getAuthzId().length() > 0) { try { int suPermission = ssoResroleRepository.findResroleAuthcSuPermission(token.getAuthzId()); if (SSORegisterMeta.SU_PERMISSION_YES_VALUE == suPermission && ResMeta.SU_PRIVILEGE_YES_VALUE == resInfo.getSuPrivilege()) { cmdTicket.setSu_cmd(resInfo.getSuCmd()); cmdTicket.setSu_pwd(this.getPasswd(resInfo.getId(), resInfo.getSuManagerAcc())); cmdTicket.setSu_pwd_prompt(resInfo.getSuPwdPrompt()); } } catch (Exception e) { } }
这段代码可以进行如下优化:
1. 将重复的代码块提取出来,避免代码重复:
```java
if (!this.fillIssuerInfo(ssoTicket, token.getIssuerId(), token.getIssuerToolId(), token.getResType(), sid)) {
String err = "加载应用发布错误";
rv.setDetail(err);
rv.setStatus(DataResult.STA_SSO_REGISTER_TICKET_ERR);
logger.error(err);
return null;
}
```
可以将其提取为一个方法,减少代码冗余。
2. 使用 switch-case 替代多个 if-else if 语句:
```java
switch (token.getLoginProtocol()) {
case ResMeta.PROTOCOL_HTTPS:
case ResMeta.PROTOCOL_HTTP:
ssoTicket.setHostDomainName(token.getTargetIp());
ssoTicket.setWebappUrl(token.getLoginProtocol() + "://" + token.getTargetIp());
ssoTicket.setAgreementType(token.getLoginProtocol());
break;
case ResMeta.RESTYPE_CSAPP:
if (!this.fillIssuerInfo(ssoTicket, token.getIssuerId(), token.getIssuerToolId(), token.getResType(), sid)) {
String err = "加载应用发布错误";
rv.setDetail(err);
rv.setStatus(DataResult.STA_SSO_REGISTER_TICKET_ERR);
logger.error(err);
return null;
}
break;
case ResMeta.PROTOCOL_RDP:
if (ssoAcc != null && ssoAcc.getWinAccType() == AccMeta.WIN_ACC_DOMAIN_TYPE) {
this.fillHostDomain(ssoAcc, ssoTicket, token.getAccName());
} else if (resInfo.getHostName() != null && resInfo.getHostName().length() > 0) {
ssoTicket.setAcc(resInfo.getHostName() + "\\" + ssoTicket.getAcc());
}
break;
case ResMeta.PROTOCOL_SSH2:
case ResMeta.PROTOCOL_SSH1:
case ResMeta.PROTOCOL_TELNET:
CMDSSOTicket cmdTicket = (CMDSSOTicket) ssoTicket;
if (token.getWorkId() != null && token.getWorkId().length() > 0) {
try {
SSOWorkOrderAuthz authz = new SSOWorkOrderAuthz();
authz.setWorkOrderId(token.getWorkId());
authz.setResId(token.getResId());
int suPermission = ssoWorkOrderRepository.findWorkOrderAuthcSuPermission(authz);
if (SSORegisterMeta.SU_PERMISSION_YES_VALUE == suPermission && ResMeta.SU_PRIVILEGE_YES_VALUE == resInfo.getSuPrivilege()) {
cmdTicket.setSu_cmd(resInfo.getSuCmd());
cmdTicket.setSu_pwd(this.getPasswd(resInfo.getId(), resInfo.getSuManagerAcc()));
cmdTicket.setSu_pwd_prompt(resInfo.getSuPwdPrompt());
}
} catch (Exception e) {
}
} else if (token.getAuthzId() != null && token.getAuthzId().length() > 0) {
try {
int suPermission = ssoResroleRepository.findResroleAuthcSuPermission(token.getAuthzId());
if (SSORegisterMeta.SU_PERMISSION_YES_VALUE == suPermission && ResMeta.SU_PRIVILEGE_YES_VALUE == resInfo.getSuPrivilege()) {
cmdTicket.setSu_cmd(resInfo.getSuCmd());
cmdTicket.setSu_pwd(this.getPasswd(resInfo.getId(), resInfo.getSuManagerAcc()));
cmdTicket.setSu_pwd_prompt(resInfo.getSuPwdPrompt());
}
} catch (Exception e) {
}
}
break;
}
```
使用 switch-case 可以使代码更加简洁和易读。
这些优化可以提高代码的可维护性和可读性。
阅读全文