java && 和 &、|| 和 | 的区别和作用
我在学java网络编程Socket的时候遇到这么个问题
//这是并发的服务端代码,run是实现Runnable接口的方法
public void run() {
try {
System.out.println(s.getInetAddress().getHostAddress());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
if (br.readLine().equals("123") && br.readLine().equals("aaa")) { //问题出在这里
pw.println("登录成功");
} else {
pw.println("密码错误");
}
s.shutdownInput();
s.shutdownOutput();
s.close();
} catch (
IOException e) {
e.printStackTrace();
}
}
}
当我开启服务端和客户端时,如果客户端输入的代码是
123
aaa
将返回“登录成功”
如果是
123
abc //输入错误的密码
将返回“密码错误”
但是如果是这样呢
456 //帐号密码都是错的
abc
返回的是“null”
我想了很久,发现问题出在这里:
if (br.readLine().equals("123") && br.readLine().equals("aaa"))
如果使用&&,if的判断可能会只判断一次,也就是“br.readLine.equals("123")”如果为false,那么后面部分的语句将不再执行,而这时候流还没读取完,所以就服务端的getOutputStream没有执行,客户端没收到值,输出自然就为null了
我想到的一个办法就是不使用&&而使用&
即:if (br.readLine().equals("123") & br.readLine().equals("aaa"))
当流在读取时,如果if第一个判断读到false仍然会继续判断,这样流的读取就可以顺利读完,服务端的输出流也可以正常执行了
总结:&& & || 和 | 会影响到判断语句的判断方式,一般来说,常用&& 和 ||
&& :判断时,如果第一个为true,继续判断第二个,第三个... 如果全部为true,结果为true,如果判断过程中一旦遇到false,将停止判断,因为对于判断是否全部为true的&&来说,只要有一个false,那么后续的判断都没有意义
||:它判断时,只要有一个为true,那么他得出的结果就为true,后续的判断也没意义,如果全为false,那么结果为false
& 和 | :它们的判断结果和&&、|| 没有区别,但在执行时有,也就是如果执行到某一部分即使已经得出结果,它们仍然会继续判断,直到所有的判断结束
我认为,在有些时候& 和 | 还是很有用的!
我在学java网络编程Socket的时候遇到这么个问题
//这是并发的服务端代码,run是实现Runnable接口的方法
public void run() {
try {
System.out.println(s.getInetAddress().getHostAddress());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
if (br.readLine().equals("123") && br.readLine().equals("aaa")) { //问题出在这里
pw.println("登录成功");
} else {
pw.println("密码错误");
}
s.shutdownInput();
s.shutdownOutput();
s.close();
} catch (
IOException e) {
e.printStackTrace();
}
}
}
当我开启服务端和客户端时,如果客户端输入的代码是
123
aaa
将返回“登录成功”
如果是
123
abc //输入错误的密码
将返回“密码错误”
但是如果是这样呢
456 //帐号密码都是错的
abc
返回的是“null”
我想了很久,发现问题出在这里:
if (br.readLine().equals("123") && br.readLine().equals("aaa"))
如果使用&&,if的判断可能会只判断一次,也就是“br.readLine.equals("123")”如果为false,那么后面部分的语句将不再执行,而这时候流还没读取完,所以就服务端的getOutputStream没有执行,客户端没收到值,输出自然就为null了
我想到的一个办法就是不使用&&而使用&
即:if (br.readLine().equals("123") & br.readLine().equals("aaa"))
当流在读取时,如果if第一个判断读到false仍然会继续判断,这样流的读取就可以顺利读完,服务端的输出流也可以正常执行了
总结:&& & || 和 | 会影响到判断语句的判断方式,一般来说,常用&& 和 ||
&& :判断时,如果第一个为true,继续判断第二个,第三个... 如果全部为true,结果为true,如果判断过程中一旦遇到false,将停止判断,因为对于判断是否全部为true的&&来说,只要有一个false,那么后续的判断都没有意义
||:它判断时,只要有一个为true,那么他得出的结果就为true,后续的判断也没意义,如果全为false,那么结果为false
& 和 | :它们的判断结果和&&、|| 没有区别,但在执行时有,也就是如果执行到某一部分即使已经得出结果,它们仍然会继续判断,直到所有的判断结束
我认为,在有些时候& 和 | 还是很有用的!