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:
原因就是我們在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中需要轉義\,因此用"\\."。
總結
以上是生活随笔為你收集整理的java配置出现的问题解释_java SE问题总结(持续更新。。。)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java parsedouble val
- 下一篇: java配置pom安装依赖包,Maven