【编译错误和运行错误的区分】
一、基础知识
1.错误
错误(error)指程序运行时遇到的硬件错误,或者操作系统、虚拟机等系统软件错误或操作错误;
错误对于程序而言是致命的;
程序本身不能处理错误,只能依靠外界敢于,否则会一直处于非正常状态。如:没有找到.class文件
或者文件中没有main()方法等;
java.lang.Error是错误类,产生错误时,java虚拟机生成并抛出Error类对象。如:没有main方法产生
NoClassDefFoundError,使用new分配内存时,没有可用内存产生OutOfMemoryError.
2.异常
异常实质在硬件、操作系统或虚拟机等系统软件运行正常时,程序产生的运行错误;
异常对于程序是非致命的;
异常处理机制能使程序捕捉和处理异常,由异常处理代码调整程序运行方向继续运行;
java.lang,Exception异常类是所有异常类 所后构成树层次结构的根类。
Java定义异常类主要分为运行异常和非运行异常。运行异常是指由程序本身错误或数据错误引发的
异常,这类异常程序设计时大多可以避免;非运行异常是指由程序运行环境错误引发的异常,这类异
常必须捕获并处理。
二、编译错误和运行错误的区分
1.编译错误一般指语法错误或者很明显的逻辑错误。
如:缺少分号,少写括号…
在eclipse往往会画红线;
2.运行错误是在没有编译错误的基础上运行后产生的错误。
如:空指针异常,除数为0…

【编译错误】

错误一:需要<标识符>

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志


原因:

编译器检测到class这个单词,那么编译器会从class这个单词后面找类名,而类名是标识符,但是“123ABC”不是标识符(不符合标识符命名规则2),所以编译器提示的错误信息是:需要<标识符>

解决办法:
将123ABC修改为合法的标识符

错误二:需要‘{’

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_02


原因:

编译器检测到class,然后找class后面的标识符,编译器找到一个合法的标识符“Hello”,然后编译器继续往后找“{”,结果没有找到“{”,所以报错了。

解决办法:
办法1:把World删除
办法2:把空格删除

错误三:需要找不到符号
System.out.pritln(i)

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_03


原因:

局部定义变量i,没有定义全局变量

解决办法:

定义变量i


【运行错误】

*Q1:解决在eclipse中使用Graphics类中的方法paint无法使用,产生生成窗口黑色背景覆盖问题:

解决前窗口状态:

java编译器中有个闪烁的标志 编译java程序时出现error_Java_04


解决办法:

方法重写时,先调用 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);
}

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_05


paint

public void paint(Graphics g)绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。

如果重新实现此方法,那么应该调用 super.paint(g) 方法,从而可以正确地呈现轻量级组件。

如果通过 g 中的当前剪切设置完全剪切某个子组件,则不会将 paint() 转发给这个子组件。

覆盖:
类 Component 中的 paint
参数:
g - 指定的 Graphics 窗口
另请参见:
Component.update(Graphics)

解决后窗口状态:

java编译器中有个闪烁的标志 编译java程序时出现error_Java_06

*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异常,而且是在使用这个类,类加载失败的时候才会出现。

java编译器中有个闪烁的标志 编译java程序时出现error_Source_07

Q3:未报告的异常错误AddWeaponException; 必须对其进行捕获或声明以便抛出

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_08


java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_09


原因:

没有对异常进行捕获或声明。

解决办法:

在函数的后面加入throws xxxxxxException的异常捕获。

java编译器中有个闪烁的标志 编译java程序时出现error_java编译器中有个闪烁的标志_10

❓❓❓

Q4:Java中的 java.util.NoSuchElementException异常及解决方法【暂未解决】

java编译器中有个闪烁的标志 编译java程序时出现error_Java_11

NoSuchElementException源码:

如果i大于集合元素个数,则抛出异常。

java编译器中有个闪烁的标志 编译java程序时出现error_java_12


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方法定义

java编译器中有个闪烁的标志 编译java程序时出现error_java_13


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

翻译:注解不适用于局部变量

java编译器中有个闪烁的标志 编译java程序时出现error_Java_14


解决办法:不要将注解写在方法体中

java编译器中有个闪烁的标志 编译java程序时出现error_Java_15