原因可能為:
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、成都網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)成都定制網(wǎng)頁設(shè)計等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都展覽展示等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時也獲得了客戶的一致夸獎!
1、運(yùn)行的用戶數(shù)過多,對服務(wù)器造成的壓力過大,服務(wù)器無法響應(yīng),則報HTTP500錯誤。減小用戶數(shù)或者場景持續(xù)時間,問題得到解決。
2、該做關(guān)聯(lián)的地方?jīng)]有去做關(guān)聯(lián),則報HTTP500錯誤。進(jìn)行手工或者自動關(guān)聯(lián),問題得到解決。
3、錄制時請求的頁面、圖片等,在回放的時候服務(wù)器找不到,則報HTTP500錯誤,若該頁 面無關(guān)緊要,則可以在腳本中注釋掉,問題將會得到解決。例如:有驗(yàn)證碼的情況下,盡 管測試時已經(jīng)屏蔽了,但是錄制的時候提交了請求,但回放的時候不存在響應(yīng)。
4、參數(shù)化時的取值有問題,則報HTTP500錯誤。可將參數(shù)化列表中的數(shù)值,拿到實(shí)際應(yīng)用系統(tǒng)中進(jìn)行測試,可排除問題。
5、更換了應(yīng)用服務(wù)器(中間件的更換,如tomcat、websphere、jboss等),還是利用原先錄制的腳本去運(yùn)行,則很可能報HTTP500錯誤。因?yàn)楦鞣N應(yīng)用服務(wù)器處理的機(jī)制不一樣,所錄制的腳本也不一樣,解決辦法只有重新錄制腳本。
6、Windows xp2 與ISS組件不兼容,則有可能導(dǎo)致HTTP500錯誤。對ISS組件進(jìn)行調(diào)整后問題解決。
7、系統(tǒng)開發(fā)程序?qū)懙挠袉栴},則報HTTP500錯誤。例如有些指針問題沒有處理好的,有空指針情況的存在。修改程序后問題解決。
8、如果測試中所進(jìn)行的操作需要向數(shù)據(jù)庫中插入數(shù)據(jù),若大數(shù)據(jù)量的情況下導(dǎo)致數(shù)據(jù)庫中表空間已滿,或 緩沖池較小無法滿足數(shù)據(jù)的存取等,都有可能導(dǎo)致HTTP500錯誤。調(diào)整數(shù)據(jù)庫、修改連接池大小,問題解決。
500錯誤出現(xiàn)的原因太多了,對于我來說,出現(xiàn)500錯誤很都情況下都是代碼里有些關(guān)聯(lián)沒有做,然后導(dǎo)致出錯,當(dāng)然還有一小部分是有時候不注意,服務(wù)器開的時間過長,導(dǎo)致服務(wù)器崩潰,總之,很多地方都需要注意
相信作為程序員的我們在對程序進(jìn)行編譯過程中經(jīng)常會遇到錯誤,或者在運(yùn)行過程中出現(xiàn)錯誤,在這里主要跟大家談?wù)劷?jīng)常遇到的一些異常與錯誤,以及解決辦法。
異常是指程序在編譯或運(yùn)行過程出現(xiàn)的錯誤。
在java.lang包中Throwable包含了所有的異常。
Error (錯誤) 和Exception(異常)
(1)Error(錯誤)
一旦發(fā)生無法修復(fù),但可以避免發(fā)生。
常見錯誤類:
IOError:I/O錯誤,當(dāng)發(fā)生嚴(yán)重的I/O錯誤時,拋出此錯誤。
VirtualMachineError?:虛擬機(jī)錯誤,當(dāng) Java 虛擬機(jī)崩潰或用盡了它繼續(xù)操作所需的資源時,拋出該錯誤。
StackOverflowError:棧內(nèi)存滿了,當(dāng)應(yīng)用程序遞歸太深而發(fā)生堆棧溢出時,拋出該錯誤。
OutofMemoryError:堆內(nèi)存滿了,因?yàn)閮?nèi)存溢出或沒有可用的內(nèi)存提供給垃圾回收器時,Java 虛擬機(jī)無法分配一個對象,這時拋出該異常。
以上是一些常見的錯誤,在Error類中還有一些別的錯誤(參照文件Java.lang.Throwable.Error).
(2)Exception(異常)
一旦發(fā)生,可以捕獲并處理,不會導(dǎo)致程序終止,有時可以避免有時無法避免。
異常的分類:
1.編譯時異常(需要強(qiáng)制處理)?????? 2.運(yùn)行時異常(不需要強(qiáng)制處理)
常見的異常有:
IOException:輸入輸出流異常
FileNotFoundException:文件找不到的異常
ClassNotFoundException:類找不到的異常
DataFormatException:數(shù)據(jù)格式化異常
NoSuchFieldException:沒有匹配的屬性異常
NoSuchMethodException:沒有匹配的方法異常
SQLException:數(shù)據(jù)庫操作異常
TimeoutException:執(zhí)行超時異常
常見的運(yùn)行時異常:
RuntimeException:運(yùn)行時異常
NullPointerException:空指針異常
ArrayIndexOutofBoundsException:數(shù)組越界異
ClassCastException:類型轉(zhuǎn)換異常
IllegalArgumentException:非法的參數(shù)異常
InputMismatchException:輸入不匹配
以上是常見的一些異常,另外還有別的異常,參見文件:Java.lang.Throwable.Exception
既然我們常常會遇到一些異常,那我們?nèi)绾蝸硖幚磉@些異常就是一個急需解決的事情。
(1) 如何處理編譯時異常?
方法一:將需要處理的代碼塊放在一個try...catch...中
try{
//需要處理異常的代碼
}catch(XXXException ef){
ef.printStackTrace();
}
我們方法一就是要將我們不確定的代碼放入try......catch中,先進(jìn)行try一下,如果沒有異常,則不會觸發(fā)catch,沒有輸出,一旦出現(xiàn)異常,那么catch就會工作,在catch中捕獲異常信息,根據(jù)異常信息進(jìn)行補(bǔ)救措施。
如以下代碼:
方法二:在出現(xiàn)異常的方法上直接向上拋出異常,throws
void ff() throws XXXException{
}
將出現(xiàn)的異常的代碼中,放入如上的方法中,就會將異常拋給該方法的上一級,在主函數(shù)上繼續(xù)向上拋,最終拋給JVM java虛擬機(jī),讓JVM來解決該問題。
如代碼:
注意:在catch和throws的時候如果不確定是什么異常,就直接寫一個Exception.
(2) 如何處理運(yùn)行時異常?
1.一般情況下,運(yùn)行時異常是不用處理的?
2.在某些情況下,如果對發(fā)生異常的結(jié)果進(jìn)行處理,也可以對運(yùn)行時異常進(jìn)行try...catch...
以上就是一些我們處理編譯時異常和運(yùn)行時異常的方法。
在程序出現(xiàn)異常時,有時候我們可以自定義異常,以便我們能夠發(fā)現(xiàn)是什么異常。
那么如何自定義異常??
1.當(dāng)運(yùn)行時,程序出現(xiàn)意外,可以拋出異常對象來結(jié)束程序
如:
//拋出運(yùn)行時異常對象
RuntimeException ef = new RuntimeException("下標(biāo)越界!index:"+index+" ,size:"+size());
throw ef;
2.對于編譯時異常,同樣可以拋出異常對象
但在方法定義時候必須加上throws
如:
public void test(int t) throws Exception{
if (t 0 || t 100) {
Exception ef = new Exception("數(shù)據(jù)錯誤");
throw ef;
}
}
例如:
運(yùn)行結(jié)果:
從結(jié)果可以看出,我們在輸入數(shù)據(jù)的時候出現(xiàn)錯誤,這樣通過自定義異常能夠讓我們更直接快速的找到運(yùn)行或編譯時的異常。
在上述中我們分別提到了三種throw,分別是Throwable,Throws以及throw,那么到底三者有什么區(qū)別?
Throwable:是指在在Java.lang包中的一個類,其包含了所有的異常和錯誤,其中類Error和Exception 是它
的子類。
Thows:是指在解決編譯時異常,將方法中異常拋給上一級,在方法后面要加Throw Exception來進(jìn)行拋。
throw:是指在自定義異常時,如果方法出現(xiàn)異常,那么將作為引用方法的對象拋出。即拋出異常。
異常分兩類:
1、錯誤(error):JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴(yán)重情況;
2、異常(違例)exception:編程錯誤,偶然外因?qū)е碌囊话阈詥栴}。exception又分為非運(yùn)行異常(編譯異常)和運(yùn)行異常。
非運(yùn)行異常,一般是代碼書寫過程中書寫有誤造成的。
運(yùn)行異常,是代碼編譯沒有錯誤,也就是沒有出現(xiàn)語法上的錯誤,但是可能存在邏輯上的錯誤,這種錯誤只有在代碼運(yùn)行后才能顯示出來。邏輯錯誤找起來比較費(fèi)時,需要一步一步的縷清思路。
菜鳥自己得理解,希望能幫到你^_^
什么是Java程序員呢?Java程序員是這幾年出現(xiàn)的,他們的著裝經(jīng)常被吐槽,沒有人能夠get到他的笑點(diǎn),總是讓人感覺到莫名其妙,這就是很多人眼中的程序員。程序員在進(jìn)行軟件開發(fā)的時候,會存在一些錯誤的問題,學(xué)會避免是非常關(guān)鍵的。下面電腦培訓(xùn)為大家介紹一下。
1、改一行代碼,不會影響其他功能
做任何事情誠意是非常關(guān)鍵的,在不認(rèn)真的情況下任何事情都是做不好的。如果隨意改動代碼,在連接數(shù)據(jù)庫的時候會出現(xiàn)很多問題。想要成為一名合格的程序員,對代碼的嚴(yán)謹(jǐn)性是非常關(guān)鍵的。
2、不考慮自身問題
在進(jìn)行軟件開發(fā)的過程中,存在問題是不可避免的,如何面對和處理問題才是最關(guān)鍵的。如果在遇到問題的時候一直認(rèn)為是電腦的問題,這樣想法想要成為合格的程序員是不可能的。IT培訓(xùn)認(rèn)為硬件問題是比較少的,不能很好的解決自己的問題想要成功是不可能的。
3、使用臨時的方法
臨時方法并不是解決問題的最好方法,在進(jìn)行編程的過程中,由于可能出現(xiàn)的問題比較多,如果使用臨時辦法,最終可能會演變?yōu)橛谰玫霓k法,這對于程序員來說,北大青鳥認(rèn)為是非常避諱的解決方法。
4、以后在給代碼添加注釋
習(xí)慣是需要在生活中不斷養(yǎng)成的,好的習(xí)慣是成功的墊腳石。在進(jìn)行代碼書寫的時候也應(yīng)該有一個好的習(xí)慣,如果只會一味地推脫,很難讓自己前進(jìn)。
5、測試過,沒有BUG
有的程序員永遠(yuǎn)不承認(rèn)自己存在問題,代碼存在BUG是很正常的,就算進(jìn)行測試之后也會出現(xiàn)同樣的問題。在程序出現(xiàn)問題的時候不要一味的認(rèn)為是使用而導(dǎo)致的,北大青鳥云南計算機(jī)學(xué)院認(rèn)為,作為程序員,應(yīng)該解決所有存在的問題。
一)[DLS_DEAD_LOCAL_STORE]
描述: Dead store to 未使用的局部變量
解決方法:局部變量定義后未使用;實(shí)例化對象后又重新對該對象賦值
(二) [ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD]
描述:Write to static field 通過實(shí)例方法更新靜態(tài)屬性
常見于常量類,直接通過類名.常量名獲取的方式違背了封裝的原則,findbugs不提倡使用,而如果將常量改成靜態(tài)成員變量,又因?yàn)閟pring不支持靜態(tài)注入導(dǎo)致不能實(shí)現(xiàn),解決方法是非靜態(tài)的setter調(diào)用靜態(tài)的setter方法給靜態(tài)成員變量賦值。
解決方法:
常量類F:
class F{
public static String a = “123”;
}
常量a改為靜態(tài)成員變量,通過F.getA()獲取,且由于spring不支持靜態(tài)注入,改為:
class F{
private static String a;
public static Integer getA() {
return a;
}
public void setA(String a) {
setAValue(a);
}
public static void setAValue(String a) {
F.a = a;
}
}
(三) [BX_UNBOXING_IMMEDIATELY_REBOXED]
描述: Boxed value is unboxed and then immediately reboxed 裝箱的值被拆箱,然后立刻重新裝箱了
常見的是三目運(yùn)算時,同時存在基本類型和包裝類型。
解決方法:
Integer a = null;
//...
a = (a == null)?0:a;
此問題在于a不為null時,會被拆箱,賦值時再裝箱。這是自動裝箱拆箱的特性,只要運(yùn)算中有不同類型,當(dāng)涉及到類型轉(zhuǎn)換時,編譯器就會向下轉(zhuǎn)型,再進(jìn)行運(yùn)算。修改方法,統(tǒng)一類型:
Integer a = null;
//...
a = (a == null)?Integer.valueOf(0):a;
(四) [SE_BAD_FIELD]
描述: Non-transient non-serializable instance field in serializable class在可序列化的類中存在不能序列化或者不能暫存的數(shù)據(jù)
解決方法:
方法1:序列化該對象
方法2:當(dāng)采用struts2框架開發(fā),不可避免的此問題會大量出現(xiàn),因?yàn)锳ctionSupport實(shí)現(xiàn)了序列化接口,action繼承了此類,而 service沒序列化,所以在action中引用service對象時提示此錯誤,最簡單的解決方法是將service對象聲明成transient, 即service不需要序列化
方法3(未驗(yàn)證):To avoid java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableExceptionfrom those method.(action中實(shí)現(xiàn)這兩個方法?)
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
throw new java.io.NotSerializableException( getClass().getName() );
}
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
throw new java.io.NotSerializableException( getClass().getName() );
}
(五) [NP_LOAD_OF_KNOWN_NULL_VALUE]
描述: Load of known null value加載已知是null的值
解決方法:已知方法參數(shù)為null是,直接傳遞null而不是參數(shù)名
(六) [REC_CATCH_EXCEPTION]
描述: Exception is caught when Exception is not thrown 過泛地捕獲異?;虿东@異常后未做任何處理
解決方法:異常分類捕獲(至少要打印出此異常對象)
(七) [NP_NULL_PARAM_DEREF]
描述: Null passed for nonnull parameter 把空值傳給了非空的參數(shù)
解決方法:增加非空判斷
(八) [NP_IMMEDIATE_DEREFERENCE_OF_READLINE]
描述: Immediate dereference of the result of readLine() 立即引用了readLine()的結(jié)果
解決方法:判斷readLine的結(jié)果是否為空
(九) [EI_EXPOSE_REP] 惡意代碼漏洞
描述:may expose internal representation by returning getter方法返回引用類型
eclipse自動生成的引用類型(Object、數(shù)組、Date等)的getter、setter方法會得到或通過對可變對象的引用操作而暴露代碼內(nèi)部實(shí)現(xiàn),解決方法很多,只要返回的或賦值的對象不是原引用對象即可。
解決方法:
以Date類型為例:
public Date getHappenTime() {
if(happenTime != null){
return (Date) happenTime.clone();
}
return null;
}
(十) [ EI_EXPOSE_REP2] 惡意代碼漏洞
描述:may expose internal representation by storing an externally mutable object into setter方法返回引用類型
eclipse自動生成的引用類型(Object、數(shù)組、Date等)的getter、setter方法會得到或通過對可變對象的引用操作而暴露代碼內(nèi)部實(shí)現(xiàn),解決方法很多,只要返回的或賦值的對象不是原引用對象即可。
解決方法:
以Date類型為例:
public void setHappenTime(Date happenTime) {
if(happenTime != null){
this.happenTime = (Date) happenTime.clone();
}else{
this.happenTime = null;
}
}
對于每一個程序員來說,在編程過程中出現(xiàn)bug和錯誤是非常正常的一件事情,只要我們在上線之前排除問題就可以了。
今天,我們就一起來了解一下,JavaScript中的問題都有哪些。
調(diào)用棧的工作機(jī)制在探討JS中的錯誤之前,我們必須理解調(diào)用棧(CallStack)的工作機(jī)制,其實(shí)這個機(jī)制非常簡單,如果你對這個已經(jīng)一清二楚了,可以直接跳過這部分內(nèi)容。
簡單的說:函數(shù)被調(diào)用時,就會被加入到調(diào)用棧頂部,執(zhí)行結(jié)束之后,就會從調(diào)用棧頂部移除該函數(shù),這種數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵在于后進(jìn)先出,即大家所熟知的LIFO。
比如,當(dāng)我們在函數(shù)y內(nèi)部調(diào)用函數(shù)x的時候,調(diào)用棧從下往上的順序就是y-x。
Error對象及錯誤處理當(dāng)代碼中發(fā)生錯誤時,我們通常會拋出一個Error對象。
Error對象可以作為擴(kuò)展和創(chuàng)建自定義錯誤類型的原型。
Error對象的prototype具有以下屬性:constructor_負(fù)責(zé)該實(shí)例的原型構(gòu)造函數(shù);message_錯誤信息;name_錯誤的名字;上面都是標(biāo)準(zhǔn)屬性,有些JS運(yùn)行環(huán)境還提供了標(biāo)準(zhǔn)屬性之外的屬性,如Node.js、Firefox、Chrome、Edge、IE10、Opera和Safari6+中會有stack屬性,它包含了錯誤代碼的調(diào)用棧,接下來我們簡稱錯誤堆棧。
錯誤堆棧包含了產(chǎn)生該錯誤時完整的調(diào)用棧信息。
如果您想了解更多關(guān)于Error對象的非標(biāo)準(zhǔn)屬性,我強(qiáng)烈建議你閱讀MDN的這篇文章。
拋出錯誤時,你必須使用throw關(guān)鍵字。
為了捕獲拋出的錯誤,則必須使用trycatch語句把可能出錯的代碼塊包起來,catch的時候可以接收一個參數(shù),該參數(shù)就是被拋出的錯誤。
與Java中類似,JS中也可以在trycatch語句之后有finally,不論前面代碼是否拋出錯誤finally里面的代碼都會執(zhí)行,這種語言的常見用途有:在finally中做些清理的工作。
錯誤堆棧的裁剪Node.js才支持這個特性,通過Error.captureStackTrace來實(shí)現(xiàn),Error.captureStackTrace接收一個object作為1個參數(shù),以及可選的function作為2個參數(shù)。
IT培訓(xùn)認(rèn)為其作用是捕獲當(dāng)前的調(diào)用棧并對其進(jìn)行裁剪,捕獲到的調(diào)用棧會記錄在1個參數(shù)的stack屬性上,裁剪的參照點(diǎn)是2個參數(shù),也就是說,此函數(shù)之前的調(diào)用會被記錄到調(diào)用棧上面,而之后的不會。