【编译错误和运行错误的区分】
一、基础知识
1.错误
错误(error)指程序运行时遇到的硬件错误,或者操作系统、虚拟机等系统软件错误或操作错误;
错误对于程序而言是致命的;
程序本身不能处理错误,只能依靠外界敢于,否则会一直处于非正常状态。如:没有找到.class文件
或者文件中没有main()方法等;
java.lang.Error是错误类,产生错误时,java虚拟机生成并抛出Error类对象。如:没有main方法产生
NoClassDefFoundError,使用new分配内存时,没有可用内存产生OutOfMemoryError.
2.异常
异常实质在硬件、操作系统或虚拟机等系统软件运行正常时,程序产生的运行错误;
异常对于程序是非致命的;
异常处理机制能使程序捕捉和处理异常,由异常处理代码调整程序运行方向继续运行;
java.lang,Exception异常类是所有异常类 所后构成树层次结构的根类。
Java定义异常类主要分为运行异常和非运行异常。运行异常是指由程序本身错误或数据错误引发的
异常,这类异常程序设计时大多可以避免;非运行异常是指由程序运行环境错误引发的异常,这类异
常必须捕获并处理。
二、编译错误和运行错误的区分
1.编译错误一般指语法错误或者很明显的逻辑错误。
如:缺少分号,少写括号…
在eclipse往往会画红线;
2.运行错误是在没有编译错误的基础上运行后产生的错误。
如:空指针异常,除数为0…
【编译错误】
错误一:需要<标识符>
原因:
编译器检测到class这个单词,那么编译器会从class这个单词后面找类名,而类名是标识符,但是“123ABC”不是标识符(不符合标识符命名规则2),所以编译器提示的错误信息是:需要<标识符>
解决办法:
将123ABC修改为合法的标识符
错误二:需要‘{’
原因:
编译器检测到class,然后找class后面的标识符,编译器找到一个合法的标识符“Hello”,然后编译器继续往后找“{”,结果没有找到“{”,所以报错了。
解决办法:
办法1:把World删除
办法2:把空格删除
错误三:需要找不到符号
System.out.pritln(i)
原因:
局部定义变量i,没有定义全局变量
解决办法:
定义变量i
【运行错误】
*Q1:解决在eclipse中使用Graphics类中的方法paint无法使用,产生生成窗口黑色背景覆盖问题:
解决前窗口状态:
解决办法:
方法重写时,先调用 super.paint(g) 方法
paint方法不需要编写代码调用,只需要重写。
其他看jdk帮助中就行了。
public void paint(Graphics g) {
super.paint(g);// 调用父类的paint方法或调用下面的方法直接绘制组件
g.drawImage(image, 0, 0, null);
g.setFont(new Font("", Font.BOLD, 13));
g.setColor(Color.WHITE);
}
paint
public void paint(Graphics g)绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。
如果重新实现此方法,那么应该调用 super.paint(g) 方法,从而可以正确地呈现轻量级组件。
如果通过 g 中的当前剪切设置完全剪切某个子组件,则不会将 paint() 转发给这个子组件。
覆盖:
类 Component 中的 paint
参数:
g - 指定的 Graphics 窗口
另请参见:
Component.update(Graphics)
解决后窗口状态:
*Q2:Java中的ExceptionInInitializerError异常及解决方法
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
at cn.yyx.game.MyGameFrame.paint(MyGameFrame.java:58)
at cn.yyx.game.MyGameFrame.update(MyGameFrame.java:27)
at sun.awt.RepaintArea.updateComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at cn.yyx.game.GameUtil.getImage(GameUtil.java:24)
at cn.yyx.game.Explode.<clinit>(Explode.java:12)
... 27 more
解决方法:
当在静态初始化块中出现异常的时候,JVM会抛出java.lang.ExceptionInInitializerError异常,且任何异常都能引发这种情况,有时候在没有静态块的情况下也会抛出这种异常,因为java默认会将静态变量的初始化一个默认的静态初始化块中,然后按他们在源文件中的生命进行初始化;
在初始化失败之后,抛出此异常,dev会得到一个java.lang.NoClassDefFoundError异常,而且是在使用这个类,类加载失败的时候才会出现。
Q3:未报告的异常错误AddWeaponException; 必须对其进行捕获或声明以便抛出
原因:
没有对异常进行捕获或声明。
解决办法:
在函数的后面加入throws xxxxxxException的异常捕获。
❓❓❓
Q4:Java中的 java.util.NoSuchElementException异常及解决方法【暂未解决】
NoSuchElementException源码:
如果i大于集合元素个数,则抛出异常。
Q5:Java中的 java.util.ConcurrentModificationException异常及解决方法
原因:
集合元素删除之后,集合的结构发生了变化,但是没有更新迭代器(迭代器不知道集合变化了)。
解决方法:
循环下一次的时候并没有重新获取迭代器。
【其他问题】
*Q1:Win10环境变量怎么配置?
Win10环境变量配置教程 简述:
首先下载JDK到指定位置,例:D:\Java\JDk
此电脑——属性——高级系统设置——环境变量——系统变量——PATH——新建:添加D:\Java\JDk\bin
简述:
1、 类的声明中:
通过关键字extends创建一个类的子类;
一个类通过implements声明自己使用一个或多个接口。
2、 extends是继承某个类,继承后可以使用父类的方法,也可以重写父类的方法
3、 implements是实现多个接口,接口方法一般为空,必须重写才能使用
4、 Java中不支持多重继承,所以可以用接口来实现(用逗号隔开)
例:class A extends B implements C,D,E
*Q3:Java中try…catch语句块作用?
格式:
try {
//可能导致错误的代码
}catch (error){
//错误发生时怎么处理
}
作用:Try块中任何代码发生了错误,就会立即推出代码执行过程,接着执行catch块。
*Q4:String的equals方法重写?
String类型equals方法讲解
String类中的equals方法是对父类Object类中的equals方法的覆盖
equals方法定义
Object类的equals方法
“==”比较内存地址
/**
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
String类重写equals方法(覆盖Object类的equals方法)
比较字符串内容
/**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*
* <p>For finer-grained String comparison, refer to
* {@link java.text.Collator}.
*
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
Integer类重写equals方法(覆盖Object类的equals方法)
比较字符串内容
/**
* Compares this object to the specified object. The result is
* {@code true} if and only if the argument is not
* {@code null} and is an {@code Integer} object that
* contains the same {@code int} value as this object.
*
* @param obj the object to compare with.
* @return {@code true} if the objects are the same;
* {@code false} otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Q5:compareTo()返回值为-1 、 1 、 0 的排序问题
return 0和return 1和return -1
compareTo()返回值为-1 、 1 、 0 的排序问题
【例】
int age1 = this.age;
int age2 = c.age;
if (age1 == age2){
return 0;
}else if (age1 > age2){
return 1;
}else {
return -1;
}
以上代码可用一句代替【不理解,但记住】:
return this.age - c.age //=0 >0 <0
Q6:【IO流】fis.read()这一步必不可少,否则print不出字符,WHY?
byte[] bytes = new byte[fis.available()];
/**这一步必不可少,why?*/
int readCount = fis.read(bytes);
System.out.println(new String(bytes));
【解释】:
int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
此方法起到一个将文本数据装载到bytes数组的作用,必不可少!
Q7:break和return区别
break是用来跳出循环的,例如for,while,do-while都可以跳出,但不跳出函数
return是使整个函数返回的,后面的不管是循环里面还是循环外面的都不执行
Q8:‘Annotationno’ not applicable to local variable
翻译:注解不适用于局部变量
解决办法:不要将注解写在方法体中