「java经常报错」java一直报错
今天给各位分享java经常报错的知识,其中也会对java一直报错进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
北大青鸟java培训:初学Java编程最容易犯的错误有哪些?
Java编程语言应该是软件开发同学最熟悉的一种开发语言,古老但很流行,再加上现在android开发发展形势一片大好,更让Java编程的魅力十足。
不少同学都参加了Java培训,开始学习Java编程语言,那么今天IT培训就和大家说说初学Java编程难免会犯的一些错误:1、没有区分中英文无论是Java语言或者C语言还是其他语言,起特殊作用的分号“;括号(包括圆括号“中括号“[]大括号“{}以及双引号“单引号“等,都必须是英文的如果不小心输成中文的就会报错。
这类的错误需要时间和耐心解决,所以我学习的时候就要开始养成良好的习惯。
比如写分号的时候,可采用这种方法检测是否误写成中文的按快捷键Ctrl+F打开搜索对话框,输入中文的分号,然后搜索,看搜索到分号是不是应该写为英文的为保证能对整个顺序文件进行搜索,可在搜索前预先把光标移动到顺序的开始处。
因为搜索默认情况下是从当前光标处搜索到文件尾,光标之前的内容不会搜索到或者使用某些搜索选项,让它搜索完整个文件。
分别以EditPlu和Window记事本编辑器示例如下:Editplu确认选中红框中的选项。
记事本:默认向下搜索。
向下搜索完后,再点击“向上”让它向上搜索。
2、大括号忘记写使用if/els和循环时,如果只需执行一条语句,可以不用大括号。
但是如果还要添加语句,就要用大括号把多条语句包括起来,这条经常容易被人忽略。
因此,需要养成习惯:就算只执行一条语句,也要用大括号包含。
3、没有区分大小写或类名/变量名写错4、公共类名应与文件名同名一般写的类都是公共的publicJava要求保管公共类的文件的文件名必需与类同名,而且要注意大小写。
否则会报错:类XX公共的应在名为XX.Java文件中声明。
这里的XX指代某个类名,以下亦然。
5、设置classpath环境变量时忘了添加当前目录不使用IDE情况下,若要引用第三方jar包,需把这些jar包引入到classpath环境变量中。
但若设置classpath时,没有包括当前目录(.那么即使是字节码文件所在目录使用Java命令运行此字节码文件,也会报Java.lang.NoClassDefFoundError这是因为若不设置classpath则classpath自动包括当前目录;而若设置后,则不再自动包括当前目录,需要我显式指定包含,这一点与path环境变量不同。
Java是一门容易上手的编程语言,但想要融会贯通,除了掌握良好的学习方法之外,努力是必不可少的。
学习Java要对自己有充分的信心,调整学习方法和态度,如果你还没有找到如果学习Java的思路,那么不妨来北大青鸟电脑学校详细了解下吧!
java问题,他老报错。
package mypackage3;
public class CompanySalary {
public static void main(String[] args) {
Employee [] employee = new Employee[29];
for(int i=0;i employee.length;i++) { // 如:i = employee.length ? 即:i=29 i = 29 条件成立 继续执行循环 循环需要执行30次
if(i%3==0) {
employee[i]=new WeekWorker();
}
else if(i%3==1) {
employee[i]=new MonthWorker();
}
else if(i%3==2) {
employee[i]=new YearWorker();
}
}
Company c=new Company(employee);
System.out.println("公司的总薪水是"+c.getSalary()+"元");
}
}
java总报错
14 行 改成
if(files[i].isAbsolute()) processExtract(files[i].getAbsolutePath());
else System.out.println("is absoulute"); 试试
java 程序运行错误怎么办?
看是发生了什么错误,大多数错误都可以通过改写原编码来解决。
程序的错误可以抽象分为三类:语法错误、运行错误和逻辑错误。
1、语法错误
是指由于编程中输入不符合语法规则而产生的。程序编译就通不过,程序不能运行起来。此类错误最简单,调试起来比较容易
例如:表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环语句或选择语句的关键字不匹配等。通常,编译器对程序进行编译的过程中,会把检测到的语法错误以提示的方式列举出来,又称为编译错误。
语法错误的调试,则可以由集成开发环境提供的调试功能来实现,在程序进行编译时,编译器会对程序中的语法错误进行诊断。
编译诊断的语法错误分为3中:致命错误、错误和警告。
(1)致命错误:这个错误大多是编译程序内部发生的错误,发生这类错误时,编译被迫中止,只能重新启动编译程序,但是这类错误很少发生,为了安全,编译前最好还是先保存程序。
(2)错误:这个错误通常是在编译时,语法不当所引起的。例如:括号不匹配,变量未声明等。产生这类错误时,编译程序会出现报错提示,我们根据提示对源程序进行修改即可。这类错误是出现最多的。
(3)警告:是指被编译程序怀疑有错,但是不确定,有时可强行通过。例如:没有加void声明的主函数没有返回值,double数据被转换为float类型等。这些警告中有些会导致错误,有些可以通过。
常规解决方法:此类错误一般程序编译系统会自动提示相应的错误地点和错误原因,比如哪一行代码少了个括号等诸如此类的提示,常见的错误,看懂直接改正即可,如果是看不懂原因,可以将错误提示信息输入搜索引擎查找一下,一般都能找到具体的解决办法。或者有些编程平台会本身提供一个本地或者在线的信息库,提供详细的错误原因和解决办法,比如微软的.NET开发平台。
2、运行错误
指程序在运行过程中出现的错误。程序通过语法错误检测,但是运行的时候出现错误,导致程序被迫终止,此类错误有特定的发生条件,因此能够准确的定位错误代码段,因而调试也比较方便。
例如:除法运算时除数为0 、数组下标越界、文件打不开、磁盘空间不够、数据库连接错误等。
此类错误发生时,编译平台一般也会提示相应的信息,对于常规的错误会有比较精确地提示,但有时提示的错误原因会比较模糊,但因为此类错误一般在程序运行时,只在特定的条件下才会发生,所以根据错误发生的条件,能够大致判断程序出错的代码段,结合错误的原因,也能比较方便的调试出错误。
3、逻辑错误
程序运行后,没有得到设计者预期的结果,这就说明程序存在逻辑错误。这种错误在语法上是有效的,但是在逻辑上是错误的。
程序运行了,也没有出错,但是执行出来的结果不是用户想要的,分为两种情况:
A、 能够看出错误:比如查询工资大于5000的人员名单,却出现了3000的;
B、 看不出错误,直到因缘际会发现程序肯定出错了,后果很严重:比如进行一个符合大型运算,把某个常数输入错了,最后的结果人工无法判断对错,又以该结果进行其它的运算等等,最后发现错了误差过大,就得从头排查错误。
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
java经常报错的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java一直报错、java经常报错的信息别忘了在本站进行查找喔。
发布于:2022-11-28,除非注明,否则均为
原创文章,转载请注明出处。