java几种罕见毛病引见【JAVA教程】,java
java罕见毛病:
1、空指针毛病
在java数组的运用中,有时刻需要对字符串数组中的元素举行对照。那末当元素不为null时,顺序会一般运转;然则,一旦对照的元素为null,那末顺序就会涌现空指针毛病。
解决要领:到场庇护,当元素不为null时在举行推断。
public static void main(Sring[] args){ String [] sums = "adfafA"; for(int i=0;i<sums.length;i++){ if(sums[]!=null && sums[i].equals(sr)){ System.out.println("找到元素"+sums[i]); break; } } }
2、数据的精度局限与范例转换
在Java中有4种基本范例数据:
整型: -1 2 3 4 ……
浮点型:float 1.3f ; double 3.2 3.5d (未标明范例,默许最高精度)
字符型:采纳Unicode编码,2字节
布尔型:true、false
四种基本范例数据的精度局限各不相同,逐级提拔。
假如在运用数据范例时,不注意精度局限,就会涌现数据溢出,从而发作计算毛病。
四种基本范例中,整型,浮点型和字符型数据是能够互相转化的。
转换划定规矩以下:
①隐形转换:精度小的数据值,赋值给精度大的值,能够自动转换。(初级向高等)
②强迫转换:局限大的数据值,(高等到初级)
③运算自动提拔划定规矩:运算中,自动转换为精度高的数据范例。
3、三种轮回的运用
①for 轮回:是一种有限次数的轮回,在轮回前,规定好轮回次数。
for(表达式;表达式;表达式){ 轮回体 }
break语句:实行后,马上跳出轮回,不在实行背面的语句,且完毕一切轮回。
continue 语句:实行后,马上跳出当前单词轮回,从新推断前提是不是继承循。
②While轮回语句:合适未知次数的轮回。
while(前提表达式){ 语句 };
③do-While轮回:也是未知次数的轮回。单最少要先实行一次do,在推断。假如while建立,继承轮回,反之,完毕轮回。
do { 语句 }while(前提表达式);
4、屡次拷贝字符串
测试所不能发明的一个毛病是生成不可变(immutable)对象的多份拷贝。不可变对象是不可转变的,因而不需要拷贝它。最经常使用的不可变对象是String。
假如你必需转变一个String对象的内容,你应当运用StringBuffer。下面的代码会一般事变:
String s = new String ("Text here");
然则,这段代码机能差,而且没有必要这么庞杂。你还能够用以下的体式格局来重写上面的代码:
String temp = "Text here"; String s = new String (temp);
然则这段代码包含分外的String,并不是完全必要。更好的代码为:
String s = "Text here";
5、没有克隆(clone)返回的对象
封装(encapsulation)是面向对象编程的主要观点。不幸的是,Java为不警惕突破封装供应了轻易——Java许可返回私有数据的援用(reference)。下面的代码展现了这一点:
import java.awt.Dimension; /***Example class.The x and y values should never*be negative.*/ public class Example{ private Dimension d = new Dimension (0, 0); public Example (){ } /*** Set height and width. Both height and width must be nonnegative * or an exception is thrown.*/ public synchronized void setValues (int height,int width) throws IllegalArgumentException{ if (height <0 || width <0) throw new IllegalArgumentException(); d.height = height; d.width = width; } public synchronized Dimension getValues(){ // Ooops! Breaks encapsulation return d; } }
Example类保证了它所存储的height和width值永久非负数,试图运用setValues()要领来设置负值会触发非常。不幸的是,因为getValues()返回d的援用,而不是d的拷贝,你能够编写以下的破坏性代码:
Example ex = new Example(); Dimension d = ex.getValues(); d.height = -5; d.width = -10;
如今,Example对象具有负值了!假如getValues() 的调用者永久也不设置返回的Dimension对象的width 和height值,那末仅凭测试是不可能检测到这类的毛病。
不幸的是,跟着时刻的推移,客户代码可能会转变返回的Dimension对象的值,这个时刻,追随毛病的泉源是件死板且费时的事变,尤其是在多线程环境中。
更好的体式格局是让getValues()返回拷贝:
public synchronized Dimension getValues(){ return new Dimension (d.x, d.y); }
6、拷贝毛病的数据
有时刻顺序员晓得必需返回一个拷贝,然则却不警惕拷贝了毛病的数据。因为仅仅做了部份的数据拷贝事变,下面的代码与顺序员的企图有误差:
import java.awt.Dimension; /*** Example class. The height and width values should never * be negative. */ public class Example{ static final public int TOTAL_VALUES = 10; private Dimension[] d = new Dimension[TOTAL_VALUES]; public Example (){ } /*** Set height and width. Both height and width must be nonnegative * or an exception will be thrown. */ public synchronized void setValues (int index, int height, int width) throws IllegalArgumentException{ if (height <0 || width <0) throw new IllegalArgumentException(); if (d[index] == null) d[index] = new Dimension(); d[index].height = height; d[index].width = width; } public synchronized Dimension[] getValues() throws CloneNotSupportedException{ return (Dimension[])d.clone(); } }
这儿的问题在于getValues()要领仅仅克隆了数组,而没有克隆数组中包含的Dimension对象,因而,虽然调用者没法转变内部的数组使其元素指向差别的Dimension对象,然则调用者却能够转变内部的数组元素(也就是Dimension对象)的内容。要领getValues()的更好版本为:
public synchronized Dimension[] getValues() throws CloneNotSupportedException{ Dimension[] copy = (Dimension[])d.clone(); for (int i = 0; i // NOTE: Dimension isn’t cloneable. if (d != null) copy[i] = new Dimension (d[i].height, d[i].width); } return copy; }
在克隆原子范例数据的多维数组的时刻,也会犯相似的毛病。原子范例包含int,float等。简朴的克隆int型的一维数组是准确的,以下所示:
public void store (int[] data) throws CloneNotSupportedException{ this.data = (int[])data.clone(); // OK }
拷贝int型的二维数组更庞杂些。Java没有int型的二维数组,因而一个int型的二维数组实际上是一个如许的一维数组:它的范例为int[]。简朴的克隆int[][]型的数组会犯与上面例子中getValues()要领第一版本一样的毛病,因而应当防止这么做。下面的例子演示了在克隆int型二维数组时毛病的和准确的做法:
public void wrongStore (int[][] data) throws CloneNotSupportedException{ this.data = (int[][])data.clone(); // Not OK! } public void rightStore (int[][] data){ // OK! this.data = (int[][])data.clone(); for (int i = 0; i if (data != null) this.data[i] = (int[])data[i].clone(); } }
更多java学问请关注java基本教程栏目。
以上就是java几种罕见毛病引见的细致内容,更多请关注ki4网别的相干文章!