java常见错误以及可能原因集锦,java错误类型与解决方法
如何解决写爬虫IP受阻的问题?立即使用。
常见java错误:
1.空指针错误
在java数组的使用中,有时需要比较字符串数组中的元素。那么当元素不为空时,程序就会正常运行;但是,一旦被比较的元素为空,程序就会出现空指针错误。
解决方法:增加保护,判断元素何时不为空。
公共静态void main(Sring[] args){
string[]sums= adfafA ;
for(int I=0;isums.lengthi ){
if(sums[]!=空和[i]。等于(sr)){
system . out . println( element found sums[I]);
打破;
}
}
}2.数据的精度范围和类型转换
Java中有四种基本的数据类型:
整数:-1 2 3 4.
浮点型:浮点1.3f3.2 3.5D(未指明类型,默认最高精度)
类型:Unicode编码,2个字节。
布尔型:真,假
四种基本类型数据的精度范围是不同的,并且是逐步提高的。
如果在使用数据类型时不注意精度范围,就会出现数据溢出,导致计算错误。
在这四种基本类型中,整数、浮点和字符数据可以相互转换。
转换规则如下:
隐形转换:低精度的数据值在赋值给高精度的值时可以自动转换。(低电平到高电平)
强制转换:大范围的数据值,(高级到低级)
运算自动提升规则:运算过程中,自动转换为精度高的数据类型。
3.使用三个周期
for循环:是一个次数有限的循环。在循环之前,指定循环次数。
For(表情;表情;表情){
环状体
}break语句:执行后,立即跳出循环,停止执行后面的语句,结束所有循环。
Continue语句:执行后,立即跳出当前word循环,重新判断条件是否继续。
While循环语句:适用于循环次数未知的情况。
While(条件表达式){
句子
};do-While循环:也是未知次数的循环。至少做一次再判断。如果while为真,则继续循环,否则,结束循环。
做{
句子
}while(条件表达式);4.多次复制字符串。
测试无法发现的一个错误是生成不可变对象的多个副本。不可变对象是不可变的,所以不需要复制它。最常用的不可变对象是String。
如果必须更改String对象的内容,应该使用StringBuffer。以下代码将正常工作:
String s=新字符串( Text here );不过这段代码性能差,没必要这么复杂。您也可以用以下方式重写上述代码:
String temp= Text here
String s=新字符串(temp);但是这段代码包含了额外的字符串,这并不是完全必要的。更好的代码是:
String s= Text here5.没有返回对象的克隆。
封装是面向对象编程的一个重要概念。可惜Java为意外破包提供了方便。Java允许返回私有数据的引用。以下代码揭示了这一点:
导入Java . awt . dimension;
/* * *示例类。x和y值不应该是负数。*/
公共类示例{
私有维度d=新维度(0,0);
公共示例(){ }
/***设置高度和宽度。高度和宽度都必须是非负的,否则会引发异常。*/
公共同步void setValues (int height,int width)引发IllegalArgumentException{
if(高度0 宽度0)
抛出新的IllegalArgumentException();
d.height=高度;
d.width=宽度;
}
公共同步维度getValues(){
//不对不对!打破封装
返回d;
}
}Example类保证其存储的高度和宽度值从不为负。试图使用setValues()方法设置负值会触发异常。不幸的是,由于getValues()返回的是对D的引用,而不是D的副本,因此您可以编写如下破坏性代码:
Example ex=new Example()。
维度d=ex . get values();
d . height=-5;
d . width=-10;现在,示例对象有一个负值!如果getValues()的调用者从来不设置返回的Dimension对象的宽度和高度值,那么仅仅通过测试是不可能检测出这样的错误的。
不幸的是,随着时间的推移,客户代码可能会改变返回的Dimension对象的值。这时,追踪错误的根源是枯燥和费时的,尤其是在多线程环境中。
更好的方法是让getValues()返回一个副本:
公共同步维度getValues(){
返回新维度(d.x,d . y);
}6.复制错误的数据
有时候程序员知道要返回一个副本,却不小心复制错了数据。由于只完成了部分数据复制工作,下面的代码偏离了程序员的意图:
导入Java . awt . dimension;
/***示例类。高度和宽度值不应*为
没有。*/
公共类示例{
static final public int TOTAL _ VALUES=10;
私有维度[] d=新维度[TOTAL _ VALUES];
公共示例(){ }
/***设置高度和宽度。高度和宽度都必须是非负的,否则将抛出异常。*/
公共同步void setValues (int index,int height,int width)抛出IllegalArgumentException{
if(高度0 宽度0)
抛出新的IllegalArgumentException();
if (d[index]==null)
d[index]=新维度();
d[索引]。身高=身高;
d[索引]。宽度=宽度;
}
公共同步维度[] getValues()
抛出CloneNotSupportedException{
返回(Dimension[])d . clone();
}
}这里的问题是getValues()方法只克隆数组,不克隆数组中包含的Dimension对象。因此,尽管调用方不能更改内部数组以使其元素指向不同的维度对象,但调用方可以更改内部数组元素(即维度对象)的内容。getValues()方法的一个更好的版本是:
公共同步维度[] getValues()引发CloneNotSupportedException{
Dimension[]copy=(Dimension[])d . clone();
for(int I=0;我
//注意:维度是不可克隆的。
如果(d!=空)
复制[i]=新维度(d[i])。高度,d[i]。宽度);
}
返回副本;
}克隆原子数据的多维数组时也会犯类似的错误。原子包括int,float等。简单克隆int类型的一维数组是正确的,如下所示:
公共void存储(int[] data)引发CloneNotSupportedException{
this . data=(int[])data . clone();
//好的
}复制int类型的二维数组比较复杂。没有Java int类型的二维数组,所以int类型的二维数组实际上是类型为int[]的一维数组。简单地克隆一个int[][]类型的数组会犯和上面例子中第一个版本的getValues()方法一样的错误,所以应该避免。以下示例演示了克隆int二维数组的错误和正确方法:
public void wrong store(int[][]data)引发CloneNotSupportedException{
this . data=(int[][])data . clone();//不OK!
}
public void right store(int[][]data){
//好吧!
this . data=(int[][])data . clone();
for(int I=0;我
如果(数据!=空)
this.data[i]=(int[])data[i]。clone();
}
}更多java知识请关注java基础教程部分。以下是几个常见java错误的详细信息。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。