java配置出现的问题解释_java SE问题总结(持续更新。。。)

q:安装的jdk为什么没有javac.exe文件?

a:JDK和JRE一定不能安装在同一文件夹中,(jdk自带的那个jre除外)否则运行的时候会找不到javac命令。 原因:JRE晚于JDK安装,而JRE只是提供Java运行环境,不需要javac编译命令的。 JRE安装前你会发现它会自动删除一些无关文件,如果同JDK安装在同一目录下,原本JDK中完好的javac命令就会被删除!! 解决方案:重新安装一次JDK 你会发现系统会安装两次文件 第一次的是jdk 第二次的是jre 只要保证你两次安装的目录不是同一个就OK。

另外切记jdk和jre分别装在不同盘符,这样也会导致意想不到的惊喜!

q:java环境变量全删除了怎么java.exe还是能在cmd下执行呢?

a:当在控制台执行java.exe,操作系统寻找JRE的方式如下:

先找当前目录下有没有JRE

再找父目录下有没有JRE

接着在PATH路径中找JRE

注册表 KEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看 CurrentVersion的键值指向哪个JRE

最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。

也就是说删除了环境变量,javac.exe是无法编译的,但是java.exe运行的是jre下的java.exe.

q:编译出现乱码怎么破?

a:1.notepad++-->格式-->然后选择编码-->ANSI

q:int a =10;long b = 20L; int c =a+b;为什么错了?

a:无法自动转换到小的数据类型中,有可能会丢失精度。比如long-->int,int-->byte;

而从小数据类型向大的数据类型转,可以自由转换:

q:如下代码执行结果是什么原因

String s1 = "abc";

String s2 = "abc";

String s3 = "abcabc";

System.out.println(s1==s2); //true

System.out.println(s3==s1+s2); //false

System.out.println(s3=="abc"+"abc"); //true

分析: "abc" 存在字符串常量池中,并且只存在一份,所以s1、 s2指向同一片栈空间中的字符串常量池中的空间,因此第一行true;并且"abc"+"abc"会被编译器自动优化成"abcabc",生成的字符串同样存放在字符串常量池中,并且我们知道常量池中只存在一份,因此第三行true。那为什么第二行是false呢,s1、s2是两个对象相加,而并非字符串,因此结果无法在编译期确定,因此不放在字符串常量池中,因此地址不相同。

q: 静态变量,静态代码快,属性,构造方法,静态方法,普通方法的执行顺序是什么?

首先要分开看,我们在使用不同方式初始化类的时候JVM分别做了不同的工作,我们仅以调用静态方法和new 类的对象两方面说起:

1> 调用类的静态方法,比如StringUtil.isEmpty();首先加载静态变量或者执行静态代码块,并且这项工作只做一次,二者谁写在前面,先执行谁。然后我们调用了isEmpty静态方法,才会加载并执行该方法。因此此类执行的顺序为: 静态变量/或者静态代码快 --- 静态方法

2>使用new 初始化对象,首先还是加载静态变量或者执行静态代码块,如果此项工作已经做过,将不再执行。其次是加载类的属性,其次构造方法,最后直到调用该对象的某个普通方法才会去加载该方法。因此执行顺序为:

静态变量/或者静态代码快 --- 属性---构造方法---普通方法。

构造方法和普通方法中不能调用静态变量,静态方法可以。静态的东西是类拥有的所有方法共享,只有一份,在静态方法里调用普通方法或者属性,必须new出来对象才能用。(个人理解,万望指正)

q:使用Iterator的next(),sacnner.next()遇到的DT问题解释:

a:大家看如下代码有没有问题:

String name = "tom";

List list = new ArrayList<>();

list.add("tom");

Iterator listIt = list.iterator();

if (listIt.hasNext()) {

if (listIt.next().equals(name)) {

System.out.println(listIt.next());

}

}

相信大家能够看出来问题所在,没错,会爆NoSuchElementException:

5b6cbc12b719

原因就是我们在list里加入一个元素,在遍历的时候调用了两次listIt的next()方法,这就导致了,判断的时候调用获取了"tom",进入if判断之后,打印又调用一次,第二次调用的时候会去找迭代器的下一个元素,所以报错。每调用一次,就会获得当前值的下一个值。正确做法是:

if (listIt.hasNext()) {

String itName = listIt.next();

if (itName.equals(name)) {

System.out.println(itName );

}

}

类似的还有Scanner.next()方法,同理,不再赘述。

q:转义的时候\n \t \r 都是单斜杠就可以了,为什么用.的时候要\\. 双斜杠呢?

a:注意用.的时候是在正则表达式中使用的,在正则表达式中 .可以标识任意字符,想仅仅匹配.就必须转义

(例如邮箱正则表达式)。我们都知道转义需要\,但是在java中,.并不是特殊字符,可以直接用".",不需

要转义,而你直接转义"/."会报错,在java中需要转义\,因此用"\\."。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值