
正文
java代码最基本错误 java代码常见问题汇总
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java编程中常见的错误有哪些
相信作为程序员的我们在对程序进行编译过程中经常会遇到错误,或者在运行过程中出现错误,在这里主要跟大家谈谈经常遇到的一些异常与错误,以及解决办法。
异常是指程序在编译或运行过程出现的错误。
在java.lang包中Throwable包含了所有的异常。
Error (错误) 和Exception(异常)
(1)Error(错误)
一旦发生无法修复,但可以避免发生。
常见错误类:
IOError:I/O错误,当发生严重的I/O错误时,抛出此错误。
VirtualMachineError :虚拟机错误,当 Java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误。
StackOverflowError:栈内存满了,当应用程序递归太深而发生堆栈溢出时,抛出该错误。
OutofMemoryError:堆内存满了,因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟机无法分配一个对象,这时抛出该异常。
以上是一些常见的错误,在Error类中还有一些别的错误(参照文件Java.lang.Throwable.Error).
(2)Exception(异常)
一旦发生,可以捕获并处理,不会导致程序终止,有时可以避免有时无法避免。
异常的分类:
1.编译时异常(需要强制处理) 2.运行时异常(不需要强制处理)
常见的异常有:
IOException:输入输出流异常
FileNotFoundException:文件找不到的异常
ClassNotFoundException:类找不到的异常
DataFormatException:数据格式化异常
NoSuchFieldException:没有匹配的属性异常
NoSuchMethodException:没有匹配的方法异常
SQLException:数据库操作异常
TimeoutException:执行超时异常
常见的运行时异常:
RuntimeException:运行时异常
NullPointerException:空指针异常
ArrayIndexOutofBoundsException:数组越界异
ClassCastException:类型转换异常
IllegalArgumentException:非法的参数异常
InputMismatchException:输入不匹配
以上是常见的一些异常,另外还有别的异常,参见文件:Java.lang.Throwable.Exception
既然我们常常会遇到一些异常,那我们如何来处理这些异常就是一个急需解决的事情。
(1) 如何处理编译时异常?
方法一:将需要处理的代码块放在一个try...catch...中
try{
//需要处理异常的代码
}catch(XXXException ef){
ef.printStackTrace();
}
我们方法一就是要将我们不确定的代码放入try......catch中,先进行try一下,如果没有异常,则不会触发catch,没有输出,一旦出现异常,那么catch就会工作,在catch中捕获异常信息,根据异常信息进行补救措施。
如以下代码:
方法二:在出现异常的方法上直接向上抛出异常,throws
void ff() throws XXXException{
}
将出现的异常的代码中,放入如上的方法中,就会将异常抛给该方法的上一级,在主函数上继续向上抛,最终抛给JVM java虚拟机,让JVM来解决该问题。
如代码:
注意:在catch和throws的时候如果不确定是什么异常,就直接写一个Exception.
(2) 如何处理运行时异常?
1.一般情况下,运行时异常是不用处理的
2.在某些情况下,如果对发生异常的结果进行处理,也可以对运行时异常进行try...catch...
以上就是一些我们处理编译时异常和运行时异常的方法。
在程序出现异常时,有时候我们可以自定义异常,以便我们能够发现是什么异常。
那么如何自定义异常??
1.当运行时,程序出现意外,可以抛出异常对象来结束程序
如:
//抛出运行时异常对象
RuntimeException ef = new RuntimeException("下标越界!index:"+index+" ,size:"+size());
throw ef;
2.对于编译时异常,同样可以抛出异常对象
但在方法定义时候必须加上throws
如:
public void test(int t) throws Exception{
if (t 0 || t 100) {
Exception ef = new Exception("数据错误");
throw ef;
}
}
例如:
运行结果:
从结果可以看出,我们在输入数据的时候出现错误,这样通过自定义异常能够让我们更直接快速的找到运行或编译时的异常。
在上述中我们分别提到了三种throw,分别是Throwable,Throws以及throw,那么到底三者有什么区别?
Throwable:是指在在Java.lang包中的一个类,其包含了所有的异常和错误,其中类Error和Exception 是它
的子类。
Thows:是指在解决编译时异常,将方法中异常抛给上一级,在方法后面要加Throw Exception来进行抛。
throw:是指在自定义异常时,如果方法出现异常,那么将作为引用方法的对象抛出。即抛出异常。
相关问答
Q1: Java程序基础错误
我想是LZ你抄错了吧。。 不可能有一本书这么糟糕的。。。如果lz你的书的确是这样写。。估计也是盗版的或者别的啥原因。。
换本吧。。
LZ你的代码有很多错。。比如,方法里嵌套方法,方法名相同.....
正确的代码应该是这样的
//定义一个Book类
class Book
{
private String name; //Book的名字
static int id = 0; //Book的id,id应该是静态的。因为你下面要输出每本书的id号
public String getName() //取得Book的名字
{
id++; //id号自加
setName("Java"); //设置Book的名字为“Java”
return id + " --" + this.name; //返回id号和书本的名字(用一个+号,意思是把整数和字符串2个值进行拼接。。)
}
private void setName(String name) //设置Book的名字
{
this.name = name;
}
public Book getNames() //返回调用这个方法的对象
{
return this;
}
}
public class Test
{
public static void main(String args[])
{
Book book = new Book(); //实例化一个Book的对象
System.out.println( book.getName() ); //用book这个对象去调用方法并打印出来getName()
}
}
运行结果:
如有不懂。。可以追问。。。
望采纳
Q2: Java开发人员最常犯的10个错误
一 、把数组转成ArrayList
为了将数组转换为ArrayList,开发者经常会这样做:
List list = Arrays.asList(arr);
使用Arrays.asList()方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽然和java.util.ArrayList同名,但是并不是同一个类。java.util.Arrays.ArrayList类中实现了set(), get(), contains()等方法,但是并没有定义向其中增加元素的方法。也就是说通过Arrays.asList()得到的ArrayList的大小是固定的。
如果在开发过程中,想得到一个真正的ArrayList对象(java.util.ArrayList的实例),可以通过以下方式:
ArrayListString arrayList = new ArrayListString(Arrays.asList(arr));
java.util.ArrayList中包含一个可以接受集合类型参数的构造函数。因为java.util.Arrays.ArrayList这个内部类继承了AbstractList类,所以,该类也是Collection的子类。
二、判断一个数组是否包含某个值
在判断一个数组中是否包含某个值的时候,开发者经常这样做:
SetString set = new HashSetString(Arrays.asList(arr));return set.contains(targetValue);
在Java中如何高效的判断数组中是否包含某个元素一文中,深入分析过,以上方式虽然可以实现功能,但是效率却比较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。
在判断一个数组是否包含某个值的时候,推荐使用for循环遍历的形式或者使用Apache Commons类库中提供的ArrayUtils类的contains方法。
三、在循环中删除列表中的元素
在讨论这个问题之前,先考虑以下代码的输出结果:
ArrayListString list = new ArrayListString(Arrays.asList("a","b","c","d"));
for(int i=0;ilist.size();i++){
list.remove(i);
}
System.out.println(list);
输出结果:
[b,d]
以上代码的目的是想遍历删除list中所有元素,但是结果却没有成功。原因是忽
略了一个关键的问题:当一个元素被删除时,列表的大小缩小并且下标也会随之变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。
也有些人知道以上代码的问题就由于数组下标变换引起的。所以,他们想到使用增强for循环的形式:
ArrayListString list = new ArrayListString(Arrays.asList("a","b","c","d"));
for(String s:list){
if(s.equals("a")){
list.remove(s);
}
}
但是,很不幸的是,以上代码会抛出ConcurrentModificationException,有趣的是,如果在remove操作后增加一个break,代码就不会报错:
ArrayListString list = new ArrayListString(Arrays.asList("a","b","c","d"));
for(String s:list){
if(s.equals("a")){
list.remove(s);
break;
}
}
在Java中的fail-fast机制一文中,深入分析了几种在遍历数组的同时删除其中元素的方法以及各种方法存在的问题。其中就介绍了上面的代码出错的原因。
迭代器(Iterator)是工作在一个独立的线程中,并且拥有一个 mutex 锁。 迭代器被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 迭代器会马上抛出java.util.ConcurrentModificationException 异常。
所以,正确的在遍历过程中删除元素的方法应该是使用Iterator:
ArrayListString list = new ArrayListString(Arrays.asList("a", "b", "c", "d"));
IteratorString iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
next()方法必须在调用remove()方法之前调用。如果在循环过程中先调用remove(),再调用next(),就会导致异常ConcurrentModificationException。原因如上。
四、HashTable 和 HashMap 的选择
了解算法的人可能对HashTable比较熟悉,因为他是一个数据结构的名字。但在Java里边,用HashMap来表示这样的数据结构。Hashtable和 HashMap的一个关键性的不同是,HashTable是同步的,而HashMap不是。所以通常不需要HashTable,HashMap用的更多。
HashMap完全解读、Java中常见亲属比较等文章中介绍了他们的区别和如何选择。
五、使用原始集合类型
在Java里边,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是一个原始类型,而Set ? 是一个无界通配符类型。 (可以把原始类型理解为没有使用泛型约束的类型)
考虑下面使用原始类型List作为参数的代码:
public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
ListString list = new ArrayListString();
add(list, 10);
String s = list.get(0);
}
上面的代码将会抛出异常:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
使用原始集合类型是很危险的,因为原始集合类型跳过了泛型类型检查,是不安全的。Set、Set ? 和Set Object 之间有很大差别。关于泛型,可以参考下列文章:《成神之路-基础篇》Java基础知识——泛型
六、访问级别
程序员们经常使用public作为类中的字段的修饰符,因为这样可以很简单的通过引用得到值,但这并不是好的设计,按照经验,分配给成员变量的访问级别应该尽可能的低。参考Java中的四种访问级别
七、ArrayList与LinkedList的选择
当程序员们不知道ArrayList与LinkedList的区别时,他们经常使用ArrayList,因为它看起来比较熟悉。然而,它们之前有巨大的性能差别。在ArrayList vs LinkedList vs Vector 区别、Java中常见亲属比较等文章中介绍过,简而言之,如果有大量的增加删除操作并且没有很多的随机访问元素的操作,应该首先LinkedList。(LinkedList更适合从中间插入或者删除(链表的特性))
八、可变与不可变
在为什么Java要把字符串设计成不可变的一文中介绍过,不可变对象有许多的优点,比如简单,安全等等。同时,也有人提出疑问:既然不可变有这么多好处,为什么不把所有类都搞成不可变的呢?
通常情况下,可变对象可以用来避免产生过多的中间对象。一个经典的实例就是连接大量的字符串,如果使用不可变的字符串,将会产生大量的需要进行垃圾回收的对象。这会浪费CPU大量的时间,使用可变对象才是正确的方案(比如StringBuilder)。
String result="";
for(String s: arr){
result = result + s;
}
StackOverflow中也有关于这个的讨论。
九、父类和子类的构造函数
上图的代码中有两处编译时错误,原因其实很简单,主要和构造函数有关。首先,我们都知道:
如果一个类没有定义构造函数,编译器将会插入一个无参数的默认构造函数。
如果一个类中定义了一个带参数的构造函数,那么编译器就不会再帮我们创建无参的构造函数。
上面的Super类中定义了一个带参数的构造函数。编译器将不会插入默认的无参数构造函数。
我们还应该知道:
子类的所有构造函数(无论是有参还是无参)在执行时,都会调用父类的无参构造函数。
所以,编译器试图调用Super类中的无参构造函数。但是父类默认的构造函数未
定义,编译器就会报出这个错误信息。
要解决这个问题,可以简单的通过
? 在父类中添加一个Super()构造方法,就像这样:
public Super(){}
? 移除自定义的父类构造函数
? 在子类的构造函数中调用父类的super(value)。
十、””还是构造函数
关于这个问题,也是程序员经常出现困惑的地方,在该如何创建字符串,使用” “还是构造函数?中也介绍过.
如果你只需要创建一个字符串,你可以使用双引号的方式,如果你需要在堆中创建一个新的对象,你可以选择构造函数的方式。
在String d = new String("abcd")时,因为字面值“abcd”已经是字符串类型,那么使用构造函数方式只会创建一个额外没有用处的对象。
还可以关注微信公众平台:javaniuniu
Q3: Java代码错误原因是啥
原因可能为:
1、运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误。减小用户数或者场景持续时间,问题得到解决。
2、该做关联的地方没有去做关联,则报HTTP500错误。进行手工或者自动关联,问题得到解决。
3、录制时请求的页面、图片等,在回放的时候服务器找不到,则报HTTP500错误,若该页 面无关紧要,则可以在脚本中注释掉,问题将会得到解决。例如:有验证码的情况下,尽 管测试时已经屏蔽了,但是录制的时候提交了请求,但回放的时候不存在响应。
4、参数化时的取值有问题,则报HTTP500错误。可将参数化列表中的数值,拿到实际应用系统中进行测试,可排除问题。
5、更换了应用服务器(中间件的更换,如tomcat、websphere、jboss等),还是利用原先录制的脚本去运行,则很可能报HTTP500错误。因为各种应用服务器处理的机制不一样,所录制的脚本也不一样,解决办法只有重新录制脚本。
6、Windows xp2 与ISS组件不兼容,则有可能导致HTTP500错误。对ISS组件进行调整后问题解决。
7、系统开发程序写的有问题,则报HTTP500错误。例如有些指针问题没有处理好的,有空指针情况的存在。修改程序后问题解决。
8、如果测试中所进行的操作需要向数据库中插入数据,若大数据量的情况下导致数据库中表空间已满,或 缓冲池较小无法满足数据的存取等,都有可能导致HTTP500错误。调整数据库、修改连接池大小,问题解决。
500错误出现的原因太多了,对于我来说,出现500错误很都情况下都是代码里有些关联没有做,然后导致出错,当然还有一小部分是有时候不注意,服务器开的时间过长,导致服务器崩溃,总之,很多地方都需要注意
Q4: java 程序中的三种错误类型分别是什么?
错误java代码最基本错误,分为编码错误,运行错误,jvm内部错误。\x0d\x0a编码错误在eclipse等开发工具 中可以直观java代码最基本错误的看到,这种错误比较少见。\x0d\x0a运行错误,又称运行时异常,这是代码逻辑错误导致java代码最基本错误的,发生这种错误时一定要静下心,从程序入口处寻找错误诱因。\x0d\x0ajvm内部错误属于Java虚拟机内部错误,比较少见,发生这种错误时,建议重启计算机。
Q5: Java初学者容易犯的错误有哪些
Java错误,主要包括两方面,一种是语法错误,另一种是逻辑错误。
语法错误,也就是我们的编码不符合java 规范,在编译的时候无法通过。通常,我们都是用javac编译我们的源程序,如果代码中存在语法错误,比如某个表达式后缺少分号的时候,编译器就会告诉我们错误信息,编译就此停止。
逻辑错误,也就是我们常说的Bug,一般存在逻辑错误的程序都是可以顺利的被编译器编译产生相应的字节码文件,也就是class文件。但是,在执行的时候,也就是java ourClass的时候,得出的结果并不是我们所希望的。
下面几个问题都是非常常见的错误,在一些新手的代码里面经常会出现的。
1、 Java是分大小写的
对于经常写VB、Asp程序的人来说,一定要注意,变量money和Money是不一样的。
2、一个java源文件可以包含多个class,但是只能包含一个public 的class。
java是面向对象的程序语言,编译完的字节码也是一个一个的类,就是class。一个.java文件可以包含多个class,在编译的时候,编译器会为每一个class生成相应的class文件。
但是必须要注意,一个.java文件只能包含一个public class,而且这个public class的类名要与这个.java的文件名一致。
比如,正确的写法应该是下面这样的:
一个java源文件,文件名为 Test.java,内容如下:
class A { } class B { } public class Test { }
3、一个等号和两个等号的不同
在Java程序中,一个等号是赋值操作符,而两个等号则是比较操作符。在 java新手的程序中
经常出现这样的代码:
int a=1; int b=2; if(a=b) System.out.println("OK");
这样是不对的,因为if后面需要得到的是一个布尔类型的值,这样编译就会出错。
因为,a=b,是赋值操作,就是把 b的值赋给了a,返回等号右边的值,也就是b的值,比如:
int a=1; int b=2; int c=(a=b); System.out.println("a : "+a); System.out.println("b: "+b); System.out.println("c: "+c);
输出结果则是,a等于2,b等于2,c也等于2, 明白了吗?
4、java中的数组下标是从0开始的
比如我们定义了一个数组
Object[] myArray=new Object[10],说明数组中有10个元素,是从myArray[0]开始,到myArray[9]结束的在用for循环的时候,需要注意,正确写法如下:
for(int i=0;imyArray.length;i++) { }
5、空引用的错误
这类错误也是最令人头疼的,属于逻辑性错误,编译器可以正常编译,但是在某种情况下执行出错,出错信息是 java.lang.NullPointerException 。
这是由于在对象的引用没有被初始化的情况下而调用这个对象的属性或者方法而造成的,比如下面的例子:
class A3 { public static void main(String[] args) { String s=null; int a=1; int b=2; if(ab) { s="ab"; } System.out.println(s.toString()); } }
编译和执行都没有错误,可是如果把a的值赋为10,如下:
class A3 { public static void main(String[] args) { String s=null; int a=10; int b=2; if(ab) { s="ab"; } System.out.println(s.toString()); } }
那么就可以正常编译通过,但是执行的时候则出错。就是因为现在ab不成立,也就是说没有执行s="ab"这个初始化语句,所以在输出s.toString()的时候,对象s其实还是null,没有被初始化,这时候调用.toString()方法自然会出现异常。
以上就简单写几个java新手经常会出现的错误,其实出现错误并不可怕,只要大家仔细的分析一下出现的错误,看看究竟是什么原因导致的,如何避免。这样,就会很快的提高自己的水平,加入到高手的行列中。由于自己也是菜鸟水平,所以写的东西,难免出现这样那样的错误,希望大家多提意见。
java代码最基本错误的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码常见问题汇总、java代码最基本错误的信息别忘了在本站进行查找喔。





